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

来源:互联网 发布:软件开发经费预算 编辑:程序博客网 时间:2024/06/01 07:50

因为要求连续,所以只要到一个位置不能扩展出增广路时,就直接返回答案就行

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

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

#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;}


0 0