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

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇