二分图匹配(匈牙利算法)

ios::sync_with_stdio(false); 的使用

https://blog.csdn.net/yujuan_mao/article/details/8119529

过山车

https://blog.csdn.net/mengxiang000000/article/details/52199146

 

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 /*
 5 测试数据 
 6 7
 7 1 1
 8 1 2
 9 2 2
10 2 3
11 3 1
12 3 2
13 4 3
14 答案 
15 3
16 */
17 /*匈牙利算法复杂度o(N3)*/ 
18 using namespace std;
19 const int maxn = 510;
20 int line[maxn][maxn];//邻接矩阵 
21 int used[maxn];// 
22 int nxt[maxn]; //如果匹配到的话匹配到的男生是谁
23 int t, n, m, u, v;
24 bool Find(int x){
25     //对于男生x能否有女生匹配 
26     for(int i = 1; i <= m; i++){
27         //第x个男生与第i个女生互相有好感
28         //并且与女生没有被匹配过 
29         if(line[x][i] && !used[i]){
30             used[i] = 1;
31              //i号女生如果没有被匹配则匹配该女生,如果该女生被匹配过,看能否将该女生匹配的男生匹配到其他女生上 
32             if(nxt[i] == 0 || Find(nxt[i])){ 
33                 nxt[i] = x;
34                 return true;
35             }
36         }
37     }
38     return false;
39 }
40 int match(){
41     int sum = 0;
42     //遍历每个男生,看能不能被匹配到 
43     for(int i = 0; i <= n; i++){
44         memset(used, 0, sizeof(used));
45         if(Find(i))sum++;
46     }
47     return sum;
48 } 
49 int main(){
50     ios::sync_with_stdio(false); 
51     int t;
52     cin >> t;
53     memset(nxt, 0, sizeof(nxt));
54     memset(line, 0, sizeof(line));
55     n = m = 4;
56     while(t--){
57         cin >> u >> v;
58         line[u][v] = 1;
59     }
60     cout << match() << endl;
61     return 0;
62 } 

 

 

hdu过山车

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 /*
 5 测试数据 
 6 hdu2063
 7 */
 8 using namespace std;
 9 const int maxn = 510;
10 int line[maxn][maxn];//邻接矩阵 
11 int used[maxn];//如果匹配到的话匹配到的男生是谁 
12 int nxt[maxn]; //
13 int t, n, m, u, v;
14 bool Find(int x){
15     //对于男生x能否有女生匹配 
16     for(int i = 1; i <= m; i++){
17         //第x个男生与第i个女生互相有好感
18         //并且女生没有被匹配过 
19         if(line[x][i] && !used[i]){
20             used[i] = 1;
21             if(nxt[i] == 0 || Find(nxt[i])){
22                 nxt[i] = x;
23                 return true;
24             }
25         }
26     }
27     return false;
28 }
29 int match(){
30     int sum = 0;
31     //遍历每个男生,看能不能被匹配到 
32     for(int i = 0; i <= n; i++){
33         memset(used, 0, sizeof(used));
34         if(Find(i))sum++;
35     }
36     return sum;
37 } 
38 int main(){
39     ios::sync_with_stdio(false); 
40     int k;
41     while(cin >> k && k){
42         cin >> n >> m;
43         memset(line, 0, sizeof(line));
44         memset(nxt, 0, sizeof(nxt));
45         while(k--){
46             cin >> u >> v;
47             line[u][v] = 1;
48         }
49     }
50     cout << match() << endl;
51     return 0;
52 } 

 

转载于:https://www.cnblogs.com/AGoodDay/p/10742014.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值