[洛谷P3386] [模板] 二分图匹配 (匈牙利算法)

题目传送门

毒瘤出题人zzk出了个二分图匹配的题(18.10.04模拟赛T2),逼我来学二分图匹配。

网络流什么的llx讲完之后有点懵,还是匈牙利比较好理解(绿与被绿)。

对于左边的点一个一个匹配,记录右边哪个点跟左边的i匹配:cp[i]

如果还没有配对,就直接配上。

如果已经有匹配了,每次dfs找增广路(看看能不能换一下),如果成功,那么匹配数增加一。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int n,m,ec,ans;
 7 int e[1005][1005];
 8 int cp[1005];
 9 int used[1005];
10 
11 int dfs(int p)
12 {
13     for(int i=1;i<=m;i++)
14     {
15         if(!used[i]&&e[p][i])
16         {
17             used[i]=1;
18             if(!cp[i]||dfs(cp[i]))
19             {
20                 cp[i]=p;
21                 return 1;
22             }
23         }
24     }
25     return 0;
26 }
27 
28 void hungary()
29 {
30     ans=0;
31     for(int i=1;i<=n;i++)
32     {
33         memset(used,0,sizeof(used));
34         if(dfs(i))ans++;
35     }
36 }
37 
38 int main()
39 {
40     scanf("%d%d%d",&n,&m,&ec);
41     for(int i=1;i<=ec;i++)
42     {
43         int a,b;
44         scanf("%d%d",&a,&b);
45         e[a][b]=1;
46     }
47     hungary();
48     printf("%d",ans);
49     return 0;
50 }
原文地址:https://www.cnblogs.com/eternhope/p/9743239.html