匈牙利算法___最大匹配
好孩子
posted @ 2011年8月21日 16:37
in 匹配问题
, 519 阅读
#include<stdio.h> #include<string.h> bool g[201][201]; int n,m,ans; bool b[201]; int link[201]; bool init() { int _x,_y; memset(g,0,sizeof(g)); memset(link,0,sizeof(link)); ans=0; if(scanf("%d%d",&n,&m)==EOF)return false; for(int i=1;i<=n;i++) { scanf("%d",&_x); for(int j=0;j<_x;j++) { scanf("%d",&_y); g[ i ][_y]=true; } } return true; } bool find(int a) { for(int i=1;i<=m;i++) { if(g[a][ i ]==1&&!b[ i ]) { b[ i ]=true; if(link[ i ]==0||find(link[ i ])) { link[ i ]=a; return true; } } } return false; } int main() { while(init()) { for(int i=1;i<=n;i++) { memset(b,0,sizeof(b)); if(find(i))ans++; } printf("%d\n",ans); } }
每次增广时间为O(E),最多进行O(V)次迭代,时间复杂度为O(VE).