因为要求连续,所以只要到一个位置不能扩展出增广路时,就直接返回答案就行
并且由此得出一个匈牙利算法的性质:
在遍历过程中,只要已经遍历过的节点能扩展出增广路,那么在之后的扩展中,他也一定在匹配的节点集 中,但是二分图另一个节点集则可能会出现变化
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int n,m,a[1009][2],match[1009];
bool use[1009];
bool dfs(int i)
{
if (use[i]) return false;
use[i]=true;
int j=a[i][0];
if (!match[j]||dfs(match[j]))
{
match[j]=i;
return true;
}
j=a[i][1];
if (!match[j]||dfs(match[j]))
{
match[j]=i;
return true;
}
return false;
}
int work()
{
int ans=0;
for (int i=1;i<=m;i++)
{
memset(use,false,sizeof(use));
if (dfs(i)) ans++;else return ans;//这个return不一样!!!
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
memset(match,0,sizeof(match));
for (int i=1;i<=m;i++) scanf("%d%d",&a[i][0],&a[i][1]);
printf("%d",work());
return 0;
}