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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值