hdu 3018(欧拉回路)

点击打开链接


题目说有n个点,m跳路,让你分最少的组,使,每组都走一天欧拉通路。。

通过判断度数是奇偶性来确定是否为欧拉回路;总之笔划数 = 奇度点数/+ 欧拉回路数;


#include"stdio.h"
#include"string.h"
#define N 100001
int a[N*2],b[N*2];
struct node
{
	int father;
	int rank;
	int degree;
	int count;
}A[N];
int find(int x)
{
	if(A[x].father==x)return x;
	A[x].father=find(A[x].father);
	return A[x].father;
}
void merge(int a,int b)
{
	if(A[a].rank>=A[b].rank)
	{
		A[b].father=a;
		if(A[a].rank==A[b].rank)
			A[a].rank++;
		A[a].count+=A[b].count;
	}
	else
	{
		A[a].father=b;
		A[b].count+=A[a].count;
	}
}

int main()
{
	int n,m;
	int i,j;
	int x,y;
	while(scanf("%d%d",&n,&m)!=-1)
	{
		memset(A,0,sizeof(A));
		for(i=0;i<=n;i++)A[i].father=i;
		for(i=0;i<m;i++)
		{
			scanf("%d%d",&a[i],&b[i]);
			A[a[i]].degree++;
			A[b[i]].degree++;
		}
		for(i=1;i<=n;i++)if(A[i].degree%2)A[i].count=1;
		for(i=0;i<m;i++)
		{
			x=find(a[i]);
			y=find(b[i]);
			if(x!=y)merge(x,y);
		}
		int ans=0;
		for(i=1;i<=n;i++)
		{
			if(A[i].degree&&A[i].father==i)
			{
				if(A[i].count!=0)ans+=A[i].count/2;
				else ans++;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值