【算法系列学习】匈牙利算法
http://www.cnblogs.com/pony1993/archive/2012/07/25/2607738.html
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 const int N=1001; 7 int n1,n2,k; 8 //n1,n2为二分图的顶点集,其中x∈n1,y∈n2 9 int map[N][N],vis[N],link[N]; 10 //link记录n2中的点y在n1中所匹配的x点的编号 11 12 int find(int x) 13 { 14 int i; 15 for(i=1;i<=n2;i++) 16 { 17 if(map[x][i]&&!vis[i])//x->i有边,且节点i未被搜索 18 { 19 vis[i]=1;//标记节点已被搜索 20 //如果i不属于前一个匹配M或被i匹配到的节点可以寻找到增广路 21 if(link[i]==0||find(link[i])) 22 { 23 link[i]=x;//更新 24 return 1;//匹配成功 25 } 26 } 27 } 28 return 0; 29 } 30 int main() 31 { 32 int i,x,y,s=0; 33 scanf("%d%d%d",&n1,&n2,&k); 34 for(i=0;i<k;i++) 35 { 36 scanf("%d%d",&x,&y); 37 map[x][y]=1; 38 } 39 for(i=1;i<=n1;i++) 40 { 41 memset(vis,0,sizeof(vis)); 42 if(find(i)) 43 s++; 44 } 45 printf("%d\n",s); 46 return 0; 47 }