码迷,mamicode.com
首页 > 其他好文 > 详细

HDOJ 欧拉回路 1878【欧拉回路判定】

时间:2015-07-30 23:19:31      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

欧拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10459    Accepted Submission(s): 3815


Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
 

Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
 

Sample Input
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
 

Sample Output
1 0
 

Author
ZJU
 

Source
 

Recommend
We have carefully selected several similar problems for you:  1880 1877 1881 1864 1873 
 

判断欧拉回路

①是否是通路

②所有点的度数为偶数

判断通路用并查集

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>

using namespace std;

int d[1010];
int r[1010];

int find_x(int x)
{
	int son=x;
	int temp;
	while(x!=r[x])
		x=r[x];
	while(son!=x){
		temp=r[son];
		r[temp]=x;
		son=temp;
	}
	return x;
}

int fun(int x,int y)
{
	x=find_x(x);
	y=find_x(y);
	if(x!=y){
		r[x]=y;
	}
}
int main()
{
	int N,M;
	while(scanf("%d",&N),N){
		scanf("%d",&M);
		memset(d,0,sizeof(d));
		int a,b;
		for(int i=0;i<=N;i++){
			r[i]=i;
		}
		for(int i=0;i<M;i++){
			scanf("%d%d",&a,&b);
			fun(a,b);
			d[a]++;
			d[b]++;
		}
		int flag=1;
		int num=0;
		for(int i=1;i<=N;i++){
			if(r[i]==i)
				num++;
		}
		for(int i=1;i<=N;i++){
			if(d[i]&1){
				flag=0;
				break;
			}
		}
		if(flag&&num==1)printf("1\n");
		else printf("0\n");
	}
    return 0;
}


版权声明:本文为博主原创文章,转载请注明出处。

HDOJ 欧拉回路 1878【欧拉回路判定】

标签:

原文地址:http://blog.csdn.net/ydd97/article/details/47158697

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!