1. 程式人生 > >HDU 3829 Cat VS Dog (最大獨立集)【二分圖匹配】

HDU 3829 Cat VS Dog (最大獨立集)【二分圖匹配】

<題目連結>

題目大意:

動物園有n條狗。m頭貓。p個小孩,每一個小孩有一個喜歡的動物和討厭的動物。如今動物園要轉移一些動物。假設一個小孩喜歡的動物在,不喜歡的動物不在,他就會happy。問動物最多能使幾個小孩happy。

解題分析:

因為本題不同的小孩之間喜好可能會產生衝突,所以,要使最多的小孩滿意,不妨將這些衝突的小孩之間相互連線,然後求出不產生衝突的最大點集,於是本題就轉化為了最大獨立集問題。最大獨立集=總點數-最大匹配數。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4
#include <string> 5 #include <cstring> 6 #include <vector> 7 using namespace std; 8 9 const int M=1505; 10 int match[M]; 11 bool vis[M]; 12 vector<int>map[M]; 13 string lk[M],dislk[M]; 14 int n,m,p,uN; 15 bool dfs(int u){ 16 for(int i=0;i<map[u].size();i++){
17 if(!vis[map[u][i]]){ 18 vis[map[u][i]]=true; 19 if(match[map[u][i]]==-1||dfs(match[map[u][i]])){ 20 match[map[u][i]]=u; 21 return true; 22 } 23 } 24 } 25 return false; 26 } 27 int hungary(){ 28 int
res=0; 29 memset(match,-1,sizeof(match)); 30 for(int u=0;u<p;u++){ 31 memset(vis,false,sizeof(vis)); 32 res+=dfs(u); 33 } 34 return res; 35 } 36 int main(){ 37 while(scanf("%d%d%d",&n,&m,&p)!=EOF){ 38 for(int i=0;i<M;i++)map[i].clear(); 39 for(int i=0;i<p;i++){ 40 cin>>lk[i]>>dislk[i]; 41 } 42 for(int i=0;i<p;i++) 43 for(int j=i+1;j<p;j++) 44 if(lk[i]==dislk[j]||dislk[i]==lk[j]){ //產生矛盾的人之間建立無向邊 45 map[i].push_back(j); 46 map[j].push_back(i); 47 } 48 printf("%d\n",p-hungary()/2); //最大獨立集=總點數-最大匹配 49 } 50 return 0; 51 }

 

 

2018-11-16