https://www.acwing.com/problem/content/863/
二分图我不太清楚,我刚做了染色法解决二分图,然后我看了相关资料。
https://blog.csdn.net/u011815404/article/details/84260940?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161372903816780271563207%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161372903816780271563207&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-84260940.pc_search_result_no_baidu_js&utm_term=%E4%BA%8C%E5%88%86%E5%9B%BE
左右两个部分,中间有m条线,问最多有多少条匹配边。
听y总讲课,我看到有人把这个叫恋爱算法,那我们也把这个叫做恋爱算法吧,哈哈哈。
匈牙利算法的前身确实有点像恋爱算法。
我还找了相关的匈牙利算法资料。(麻利的,相当不错)
https://blog.csdn.net/sunny_hun/article/details/80627351
这个篇博文中主要提到了一个字“腾”,想办法把你喜欢的遇到的前任试图给别的女生去,然后你去追她。
这样一想,其实思路就很简单了,想办法把你想得到的,把潜在的情敌赶走。
代码如下。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e3+10,M=2e5+10;
int h[N],ne[M],e[M],idx;
int n1,n2,m;
int match[N];
bool st[N];
void add(int a,int b)
{
e[idx]=b;ne[idx]=h[a];h[a]=idx++;//保存你的爱慕的人
}
bool find (int x)//找到可以匹配的对象
{
for(int i=h[x];i!=-1;i=ne[i])
{
int j=e[i];
if(!st[j])//那个人还没有被拥有
{
st[j]=true;
if(match[j]==0||find(match[j]))//match[j]==0表示还没有对象,find(match[j]是指想办法把情敌
//赶走去找别的女生,如果能找到别的女生,这个就归我了,于是结束,找到自己喜欢的女生了。
{
match[j]=x;
return true;
}
}
}
return false;//如果都不能得到,可能就是爱而不得吧。
}
int main(void)
{
memset(h,-1,sizeof h);
scanf("%d%d%d",&n1,&n2,&m);
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
int res=0;
for(int i=1;i<=n1;i++)//对每个男生进行一个遍历
{
memset(st,false,sizeof st);
if(find(i))//要是能找到对象
res++;
}
printf("%d",res);
}