hdu3097

本文介绍了一种使用并查集解决特定图划分问题的方法。文章详细解释了如何通过并查集来判断一个连通图是否能被划分为两个子集,使得每个子集内的边数均为偶数。涉及的主要步骤包括构建并查集、获取图映射关系及最终的判断逻辑。
/*
分析:
    并查集。
    仔细想想,对于一个连通的集合,如果边的数目为偶数,则
必定可以按照题中所说的方式成功划分;否则,必定不行囧~。

                                               2013-04-09
*/







#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
const int N=1005;

int pre[N],count[N];

void build(int n)
{
	int i;
	for(i=1;i<=n;i++)	{pre[i]=i;count[i]=0;}
}
int find(int k)
{
	if(pre[k]==k)	return k;
	pre[k]=find(pre[k]);
	return pre[k];
}
void get_map(int m)
{
	int a,b,f1,f2;
	while(m--)
	{
		scanf("%d%d",&a,&b);
		f1=find(a);
		f2=find(b);
		if(f1==f2)	count[f1]++;
		else
		{
			pre[f2]=f1;
			count[f1]+=count[f2]+1;
		}
	}
}
int Judge(int n)
{
	int flag=0;
	for(int i=1;i<=n;i++)
	{
		if(pre[i]!=i)	continue;
		if(count[i]%2)	{flag=1;break;}
	}
	return flag;
}
int main()
{
	int n,m;
	while(scanf("%d%d",&n,&m),n||m)
	{
		build(n);
		get_map(m);
		if(Judge(n))	cout<<"No"<<endl;
		else			cout<<"Yes"<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值