题目连接: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();
}
}