题目连接: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();
}
}
本文探讨了一道经典的动物园动物选择问题,通过构建冲突图并运用最大独立集算法找到最多可满足条件的孩子数目。介绍了使用邻接表表示冲突关系,并采用匈牙利算法求解最大独立集的具体实现。
&spm=1001.2101.3001.5002&articleId=7037319&d=1&t=3&u=2292bc4f02ab40ea9ed21dc3bca703f0)
789

被折叠的 条评论
为什么被折叠?



