루오 구 P3386 [템플릿] 분형 그래프 매칭 (헝가리 알고리즘 보강 경로)


헝가리어 알고리즘

헝가리어 알고리즘 (별칭 "개체 게임을 찾아"), 당신에게 이분 그래프를 제공 최대 매칭을 찾는 것입니다.

최대 경기 심지어 모서리의 수보다 더 많은 일을 할 수 있습니다.

우리는 현실의 문제로이 추상적 인 개념 전화 - 객체를 찾을 수 있습니다.

두 그룹, 남자와 여자 그룹 B의 그룹으로 남성과 여성, 각 소년은 더 많은 사람들이 남자 친구와 여자 친구가 될 가능성이 매우만큼, 당신의 하나님으로, (아마도 하나 이상) 자신이 좋아하는 여자가 있습니다.

그것을 어떻게?

모든 소년을 열거, 다음 대답 한 그것을 할 수 있도록하는 경우, 가능한만큼 여자 친구를 찾을 수 있지만, 그의 여자 친구의 앞에있는 사람이 대체 할 수 있도록 요청하지만, 원래는 여자 친구가 있어야 지금 여자 친구가 있습니다.

답을받은 후 모든 소년을 열거합니다.

-이 알고리즘 헝가리의 주요 아이디어 경로를 보강 .

제공 여름 캠프 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