码迷,mamicode.com
首页 > 编程语言 > 详细

模板:匈牙利算法

时间:2018-03-22 13:42:36      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:can   als   pac   ons   最大匹配   匈牙利算法   std   main   for   

 1 /*
 2 公式:
 3 二分图最小顶点覆盖 = 二分图最大匹配
 4 DAG图的最小路径覆盖 = 节点数(n)- 最大匹配数
 5 二分图最大独立集 = 节点数(n)- 最大匹配数
 6 */
 7 
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 
11 const int N=1234;
12 int n1,n2,k;
13 bool M[N][N],vis[N];
14 int Link[N];
15 
16 bool Find(int x){
17     for(int i=1;i<=n2;i++){
18         if(M[x][i]&&!vis[i]){
19             vis[i]=1;
20             if(!Link[i]||Find(Link[i])){
21                 Link[i]=x;
22                 return true;
23             }
24         }
25     }
26     return false;
27 }
28 
29 int main(){
30     int x,y,ans=0;
31     scanf("%d%d%d",&n1,&n2,&k);
32     for(int i=1;i<=k;i++){
33         scanf("%d%d",&x,&y);
34         M[x][y]=1;
35     }
36     for(int i=1;i<=n1;i++){
37         memset(vis,0,sizeof(vis));
38         if(Find(i)) ans++;
39     }
40     printf("%d\n",ans);
41     return 0;
42 }

 

模板:匈牙利算法

标签:can   als   pac   ons   最大匹配   匈牙利算法   std   main   for   

原文地址:https://www.cnblogs.com/Leonard-/p/8622863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!