hdu3829

/*
分析:
    最大独立集,把小盆友列为两个集合,矛盾是边。
   
                                  2012-08-02 12:24
*/








#include"stdio.h"
#include"string.h"


int chi;
struct node
{
	int love;
	int heat;
	int tot;
	int mem[555];
}E[555];
int match[555];
int visit[555];


struct A
{
	int t_l;
	int l_mem[555];
	int t_h;
	int h_mem[555];
}ani[222];


int DFS(int k)
{
	int i;
	for(i=0;i<E[k].tot;i++)
	{
		if(visit[E[k].mem[i]])	continue;
		visit[E[k].mem[i]]=1;
		if(match[E[k].mem[i]]==-1 || DFS(match[E[k].mem[i]]))
		{
			match[E[k].mem[i]]=k;
			return 1;
		}
	}
	return 0;
}


int main()
{
	int n,m;
	int i,l,j;
	char str1[10],str2[10];
	int f1,f2;
	int ans;
	while(scanf("%d%d%d",&n,&m,&chi)!=-1)
	{
		for(i=1;i<=n+m;i++)	ani[i].t_h=ani[i].t_l=0;
		for(i=1;i<=chi;i++)	E[i].tot=0;
		for(i=1;i<=chi;i++)
		{
			scanf("%s%s",str1,str2);


			f1=0;
			for(l=1;str1[l];l++)	{f1*=10;f1+=str1[l]-'0';}
			f2=0;
			for(l=1;str2[l];l++)	{f2*=10;f2+=str2[l]-'0';}
			if(str1[0]=='D')	f1+=n;
			else				f2+=n;


			E[i].love=f1;
			E[i].heat=f2;
			ani[f1].l_mem[ani[f1].t_l++]=i;
			ani[f2].h_mem[ani[f2].t_h++]=i;
		}


		for(i=1;i<=chi;i++)
		{
			E[i].tot=ani[E[i].heat].t_l;
			for(l=0;l<E[i].tot;l++)	E[i].mem[l]=ani[E[i].heat].l_mem[l];
			E[i].tot+=ani[E[i].love].t_h;
			for(j=0;l<E[i].tot;l++,j++)	E[i].mem[l]=ani[E[i].love].h_mem[j];
		}


		memset(match,-1,sizeof(match));
		ans=0;
		for(i=1;i<=chi;i++)
		{
			memset(visit,0,sizeof(visit));
			ans+=DFS(i);
		}


		printf("%d\n",chi-ans/2);
	}	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值