羅区P3386 [テンプレート]二部グラフマッチング(ハンガリーアルゴリズム、増強経路)

ポータル


ハンガリーのアルゴリズム

ハンガリーのアルゴリズム(別名「オブジェクトのゲームを見つける」)、最大マッチングを見つけ、あなたの二部グラフを与えることです。

最大の試合でもエッジの数よりも多くを行うことができます。

私たちは、現実の問題には、この抽象的な概念を呼ぶ - オブジェクトを見つけます。

二つのグループ、男の子と女の子のグループBのグループに男性と女性、それぞれの少年は、より多くの人がボーイフレンドとガールフレンドになっている可能性がそうな限り、あなたの神として、(おそらく複数の)自分のお気に入りの女の子を持っています。

どのようにそれを行うには?

すべての男の子を列挙し、可能な限りのガールフレンドを見つけることが求められますが、彼のガールフレンドの前で人が交換することができることを確実にするために、それを行うことができますもしそうなら、元ガールフレンドを持っている今、その後の答え1、、ガールフレンドを持っている必要があります。

答えを取得した後、すべての少年たちを列挙します。

-これは、アルゴリズムハンガリーの主なアイデアであるパスを増強します

オファーサマーキャンプZYB教師のコースウェア:

 

 ACコード

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxn=1000005;
 8 int n,m,E,p[2005],cnt,ans;
 9 bool vis[2005];
10 int girl[2005];
11 struct node{
12     int v,next;
13 }e[2*maxn];
14 void insert(int u,int v){
15     cnt++;
16     e[cnt].v=v;
17     e[cnt].next=p[u];
18     p[u]=cnt;
19 }
20 bool work(int u){
21     for(int i=p[u];i!=-1;i=e[i].next){
22         if(!vis[e[i].v]){
23             vis[e[i].v]=1;
24             if(!girl[e[i].v]||work(girl[e[i].v])){
25                 girl[e[i].v]=u;
26                 return true;
27             }
28         }
29     }
30     return false;
31 }
32 int main()
33 {
34     memset(p,-1,sizeof(p));
35     cin>>n>>m>>E;
36     for(int i=1;i<=E;i++){
37         int u,v;
38         scanf("%d%d",&u,&v);
39         if(u<=n&&v<=m){
40             insert(u,v+1000);
41             insert(v+1000,u);
42         }
43     }
44     for(int i=1;i<=n;i++){
45         memset(vis,0,sizeof(vis));
46         if(work(i)) ans++;
47     }
48     cout<<ans;
49     return 0;
50 }

おすすめ

転載: www.cnblogs.com/yinyuqin/p/12181706.html