【算法系列学习】匈牙利算法

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 }
View Code

 

posted @ 2017-04-20 21:49  shulin15  阅读(261)  评论(0编辑  收藏  举报