您的位置:首页 > 其它

bzoj1191(最大匹配,但不完全一样)

2016-06-25 11:57 344 查看
因为要求连续,所以只要到一个位置不能扩展出增广路时,就直接返回答案就行

并且由此得出一个匈牙利算法的性质:

在遍历过程中,只要已经遍历过的节点能扩展出增广路,那么在之后的扩展中,他也一定在匹配的节点集 中,但是二分图另一个节点集则可能会出现变化

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: