문
헝가리어 알고리즘
헝가리어 알고리즘 (별칭 "개체 게임을 찾아"), 당신에게 이분 그래프를 제공 최대 매칭을 찾는 것입니다.
최대 경기 심지어 모서리의 수보다 더 많은 일을 할 수 있습니다.
우리는 현실의 문제로이 추상적 인 개념 전화 - 객체를 찾을 수 있습니다.
두 그룹, 남자와 여자 그룹 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 }