HDU 3829 Cat VS Dog(最大独立集)

来源:互联网 发布:阿里云pop3设置 编辑:程序博客网 时间:2024/06/02 07:34

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3829

题意:动物园有两种动物cat和dog,数量分别是m,n。并且两种动物都已经进行编号。

每个参观的孩子都有一个喜欢的动物和不喜欢的动物

只有将他们不喜欢的动物移除动物园才能让他们高兴。如何分配才能使最多的孩子满意

解题思路:第一次看这题时以为是二分图最大匹配,可是按照cat和dog的匹配来做的话却无法建图,

后来经过小疯子提醒用最大独立集来做:

由于当前孩子喜欢的动物可能和其他孩子不喜欢,因此当前孩子就和其他孩子相冲突。

如p1:c1 d1    p2:d1 c1则p1和p2就相冲突了。则可将1和2相连(即项链就表示两个孩子之间相冲突)。

#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<vector>using namespace std;struct child{string ch1,ch2;}t[501];vector<int> s[501];int v[501],h[501];int fun(int x){for(int i=0;i<s[x].size();i++){if(!v[s[x][i]]){v[s[x][i]]=1;if(!h[s[x][i]]||fun(h[s[x][i]])){h[s[x][i]]=x;return 1;}}}return 0;}int main(){int m,n,p;while(cin>>m>>n>>p){string c,d;for(int i=1;i<=p;i++){cin>>t[i].ch1>>t[i].ch2;}for(int i=1;i<=p;i++){for(int j=1;j<=p;j++){if(i==j)continue;if(t[i].ch2==t[j].ch1){s[i].push_back(j);s[j].push_back(i);}}}memset(h,0,sizeof(h));int sum=0;for(int i=1;i<=p;i++){memset(v,0,sizeof(v));if(fun(i))sum++;}cout<<p-sum/2<<endl;for(int i=0;i<=p;i++)s[i].clear();}}


原创粉丝点击