hdu1878 欧拉回路(无向图存在欧拉回路,入门题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878

概念

欧拉回路:若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路

该题目是无向图:

无向图存在欧拉回路的充要条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。

的概念用这个图来说吧:

a,b,c,d,e的度为3,f的度为5;也就是从该点引出的边有几条,就为几度

奇数条边为奇度,偶数条边为偶度;上图的顶点度数全为奇度,所以不存在欧拉回路,也就是不能“一笔画”。

判断是否联通用并查集判断即可;

【代码】

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int degree[1200];	int n,m;
int num[1200];
void connect(int a,int b){//并查集<span style="font-family:Arial;">连接</span>
	if(num[a]==num[b])
		return ;
	int p=num[a];
	int q=num[b];
	for(int i=1;i<=n;i++)
	{
		if(num[i]=p)
			num[i]=q;
	}
}
int main(){

	while(cin>>n&&n){
		cin>>m;
		for(int i=1;i<=n;i++)//<span style="font-family:Arial;">并查集的初始化</span>
			num[i]=i;
		memset(degree,0,sizeof(degree));
		for(int i=0;i<m;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			degree[a]++;//度<span style="font-family:Arial;">加1</span>
			degree[b]++;
			connect(a,b);
		} 
		int sign=0;<span style="font-family:Arial;">//用来标记是否所有度数为偶数</span>
		for(int i=1;i<=n;i++){
			if(degree[i]%2)
			{sign=1;break;}
		}
		if(sign) cout<<"0"<<endl;
		else
		{
			int cnt=0;
			for(int i=1;i<=n;i++)//<span style="font-family:Arial;">判断是否联通</span>
			{
				if(num[i]==i)
					cnt++;
			}
			if(cnt==1)
				cout<<"1"<<endl;
			else
				cout<<"0"<<endl;
		}
	}
	return 0;
}


posted @ 2015-06-30 11:10  编程菌  阅读(957)  评论(0编辑  收藏  举报