洛谷 P3386 【模板】二分图最大匹配

题目传送门

解题思路:

匈牙利算法求二分图最大匹配,其过程为:当男生i要和女生j匹配时,如果j还没有匹配,那就i和j匹配;如果j先前已经和男生k匹配了,那就让k再去找别的女生匹配,如果找到了,i和j匹配,如果找不到,i只能当光棍。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring> 
 4 
 5 using namespace std;
 6 
 7 int n,m,e,head[501],tot,ans,p[501];
 8 bool vis[501];
 9 struct kkk{
10     int next,to;
11 }a[50001];
12 
13 inline void add(int x,int y) {
14     a[++tot].to = y;
15     a[tot].next = head[x];
16     head[x] = tot;
17 }
18 
19 inline bool find(int x) {
20     for(int i = head[x];i; i = a[i].next) {
21         int u = a[i].to;
22         if(vis[u]) continue;
23         vis[u] = 1;
24         if(p[u] == 0 || find(p[u])) {
25             p[u] = x;
26             return true;
27         }
28     }
29     return false;
30 }
31 
32 int main() {
33     scanf("%d%d%d",&n,&m,&e);
34     for(int i = 1;i <= e; i++) {
35         int x,y;
36         scanf("%d%d",&x,&y);
37         add(x,y);
38     }
39     for(int i = 1;i <= n; i++) {
40         memset(vis,0,sizeof(vis));
41         if(find(i)) ans++;
42     }
43     printf("%d",ans);
44     return 0;
45 }

 

posted @ 2020-08-11 22:36  Mr^Simon  阅读(94)  评论(0编辑  收藏  举报