如果对匈牙利算法不太懂的——请猛击
二分图最大匹配的第一题,主要是对增广路的理解,上面博客讲的很清楚,不再罗嗦,上代码——
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n;
vector<int> g[505]; //记录边
int mach[505],count;
bool flag[505];
bool find(int x)
{
int i;
for(i=0;i<g[x].size();i++)
{
int k=g[x][i];
if(!flag[k])
{
flag[k]=true; //标记和x已经匹配过的点,避免重复匹配
if(!mach[k]||find(mach[k])) //mach[k]不为0,表示k已经和mach[k]匹配过了,如果能找到增广路,即find() 为真,则k可以重新匹配,此时匹配数加1
{
mach[k]=x;
return true;
}
}
}
return false;
}
int main()
{
int t,m,a,b,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
g[i].clear();
memset(mach,0,sizeof(mach));
count=0;
while(m--)
{
scanf("%d%d",&a,&b);
g[a].push_back(b);
}
for(i=1;i<=n;i++)
{
memset(flag,false,sizeof(flag));//清空标记,上一个i匹配过的点,当前i还可以匹配
if(find(i))
count++;
}
printf("%d\n",count);
}
return 0;}