P3386 【模板】二分图匹配

链接:P3386

--------------------------------

这道题要用到一个名为匈牙利算法的东西

 

匈牙利算法就是对于每一个点,(例如A)我们先从开始找一个点(例如B),如果他们相连,并且没有被拜访过(一个点一次只能被拜访一次),就让他们配对。然而,如果B已经和C配对了,就把C赶走,看看能不能找到一个D和C配对,如果有,就让C和D配对。让A和B配对。

反之,就遍历下一个与A相连的点并重复以下步骤

-------------------------------------

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int map[2001][2001];
 7 int n,m,e;
 8 int vis[200001];
 9 int match[2000001];
10 
11 
12 bool find (int x){
13     for(int i=1;i<=m;++i){
14         if(map[x][i]){
15             if(vis[i])
16             continue;//只能拜访一次 
17             vis[i]=1;
18             if(!match[i]||find(match[i])){//试图给他找下一个点 
19                 match[i]=x;//配对 
20                 return 1;
21             }
22             
23         }
24     }
25     return 0;
26 }
27     int cnt=0;
28 void deal(){
29 
30     memset (match,0,sizeof(match));
31     for(int i=1;i<=n;++i){
32         memset(vis,0,sizeof(vis));
33         if(find(i))
34         cnt++;//找到一个就+1 
35     }
36 }
37 
38 int main(){
39     cin>>n>>m>>e;
40     for(int i=1;i<=e;++i){
41         int x,y;
42         cin>>x>>y;
43         map[x][y]=1;
44     }
45     deal();
46     cout<<cnt;
47     return 0;
48     }
Ac

 

posted @ 2019-07-29 11:11  Simex  阅读(199)  评论(0编辑  收藏  举报