hdoj 1878 欧拉回路

欧拉回路

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

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

#include<stdio.h>
#include<string.h>
#define MAX 1100
int set[MAX];
int path[MAX];
int find(int fa)
{
	int t;
	int ch=fa;
	while(fa!=set[fa])
	fa=set[fa];
	while(ch!=fa)
	{
		t=set[ch];
		set[ch]=fa;
		ch=t;
	}
	return fa;
}
void mix(int x,int y)
{
	int fx,fy;
	fx=find(x);
	fy=find(y);
	if(fx!=fy)
	set[fx]=fy;
}
int main()
{
	int n,m,j,i,s,sum,a,b,wrong;
	while(scanf("%d",&n)&&n!=0)
	{
		scanf("%d",&m);
		memset(path,0,sizeof(path));
	//	memset(chu,0,sizeof(chu));
		for(i=1;i<=n;i++)
		set[i]=i;
		for(i=1;i<=m;i++)
		{
			scanf("%d%d",&a,&b);
			path[b]++;
			path[a]++;
			mix(a,b);
		}
		sum=0;wrong=0;
		for(i=1;i<=n;i++)
		{
			if(set[i]==i)
			{
				sum++;
				if(sum>1)
				{
					wrong=1;
					break;
				}
			}
			if(path[i]!=2)
			{
				wrong=1;
				break;
			}
		}
		if(wrong)
		printf("0\n");
		else
		printf("1\n");
	}
	return 0;
}

  

Sample Output

1
0

时间: 2024-09-30 04:28:42

hdoj 1878 欧拉回路的相关文章

hdoj 1878 欧拉回路(无向图欧拉回路+并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878 思路分析:该问题给定一个无向图,要求判断该无向图是否存在欧拉回路:无向图判断存在欧拉回路的两个必要条件:该无向图为连通图且所有的结点的度数为偶数: 代码如下: #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAX_N = 1000 + 10

hdu 1878 欧拉回路 (欧拉回路)

//1.联通图 2.顶点度数都为偶数 ,则存在欧拉回路. # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int father[1010]; int vis[1010][1010],du[1010]; int find(int x) { if(father[x]==x) return x; return father[x]=find(father[x]

HDU 1878 欧拉回路 (并查集+欧拉回路)

题目地址:HDU 1878 这个题要注意欧拉回路与欧拉通路的区别.在都保证连通性的前提下,欧拉回路要求每个点的度数都是偶数,而欧拉通路允许两个点的度数是奇数.所以这题用并查集判断连通性后判断下度数就可以了. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib

hdu 1878 欧拉回路

欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对

HDU ACM 1878欧拉回路

欧拉回路的判断: 1.若有一个节点的度为奇数,则不能构成欧拉回路: 2.判断所有点是否可以一笔通过并回到起点. #include<iostream> using namespace std; #define N 1005 int deg[N]; //每个节点的度 bool vis[N]; int map[N][N]; bool DegValid(int n) { for(int i=1;i<=n;i++) if(deg[i]&1) return false; return tru

HDU 1878.欧拉回路【欧拉路及欧拉回路初接触】【8月2】

欧拉回路 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号).当N为0时输入结 束. Output 每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0.

hdu 1878 欧拉回路 水题。测试数据貌似有点问题

欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10135    Accepted Submission(s): 3708 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例

hdu 1878 欧拉回路+并查集

欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路. 无向图欧拉回路的判定:图连通:图中所有节点度均为偶数 有向图欧拉回路的判定:图连通:所有节点入度等于出度 这道题属于无向图,首先用并查集判断图的联通性,各点的度数用一个数组保存下来. 如果一个点的根结点和其他点的根结点不同,则图不联通,有点度数为奇数也不满足欧拉回路,则输出0,否则输出1. 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath&g

杭电 1878 欧拉回路

Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号).当N为0时输入结 束. Output 每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0. Sample Input