1213: 欧拉回路
时间限制: 1 Sec 内存限制: 32 MB提交: 6 解决: 5
[ 提交][ 状态][ 讨论版]
题目描述
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
样例输出
1
0
提示
来源
思路:用并查集来解,因为为无向图做两个判断,一个是看他们是否都有相同的根,二个是他们的边是否都为2.
#include<stdio.h>
#include<stdlib.h>
int Tree[1010];
int indgreed[1010];
int findroot(int x)
{
if(Tree[x]==-1)return x;
else{
int tmp=findroot(Tree[x]);
Tree[x]=tmp;
return tmp;
}
}
int main()
{
int N,M;
while(scanf("%d%d",&N,&M)!=EOF){
if(N==0)break;
for(int i=1;i<=M;i++)
{
Tree[i]=-1;
indgreed[i]=0;
}
for(int i=1;i<=M;i++){
int a,b;
scanf("%d%d",&a,&b);
indgreed[a]++;
indgreed[b]++;
a=findroot(a);
b=findroot(b);
if(a!=b) Tree[a]=b;
}
int cnt=1;
int temp=findroot(1);
for(int i=1;i<=M;i++)
{
if(findroot(i)!=temp){
cnt=0;
}
if(indgreed[i]%2!=0){
cnt=0;
}
}
printf("%d\n",cnt);
}
//system("pause");
return 0;
}