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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 12:02:47

hdu1878 欧拉回路(无向图存在欧拉回路,入门题)的相关文章

HDU-1878 判断无向图欧拉回路,水

HDU 1878 题意:问一个无向图是否存在欧拉回路. 总结: 1.一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图.2.一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图.3.要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:假设有一张图有向图G',在不论方向的情况下它与G同构.并且G'包含了G的所有有向边.那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路. // HDU-1878 #include<bits/stdc++

The Necklace UVA 10054 (无向图的欧拉回路,求证Flury算法)

说说:题目的意思本质上就是给你N条无向边,若存在欧拉回路,则将其生成.无向图的欧拉回路的判断非常容易,只要判断是否每个节点都是偶数度即可.但是,对欧拉回路的生成,也就是Fleury算法,貌似有点问题.我自己在这个地方也纠结了好久.下面就来讲讲Fleury算法. 开始我觉得,就是个非常简单的深度优先搜索的问题,直接从任意一个节点,然后不断DFS即可.所以就有了如下的代码: for(i=1;i<MAX;i++) if(map[m][i]>0){ map[m][i]--; map[i][m]--;

UVa10054 The Necklace,无向图求欧拉回路

无向图求欧拉回路: 1.图连通 2.所有顶点的度数位偶数 随便从一个点开始递归遍历即可求出路径 #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxcolor = 50; int n, G[maxcolor+1][maxcolor+1], deg[maxcolor+1]; struct Edge{ int from, to; Edge(int f

poj1041 John&#39;s trip,无向图求欧拉回路路径

点击打开链接 无向图求欧拉回路: 1.图连通 2.所有顶点的度数位偶数 #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <algorithm> using namespace std; const int mt = 2000; const int ms = 50; bool vis[mt+5]; int g[ms][mt+5]; int

The Necklace UVA - 10054 (无向图的欧拉回路)

The Necklace UVA - 10054 题意:每个珠子有两个颜色,给n个珠子,问能不能连成一个项链,使得项链相邻的珠子颜色相同. 把颜色看做点,珠子内部连一条边,无向图求欧拉回路. 这里我用的并查集. 输出路径就dfs就行了 1 #include <bits/stdc++.h> 2 using namespace std; 3 int g[55][55]; 4 int f[55]; 5 int deg[55]; 6 int n; 7 8 int gf(int x) 9 { 10 re

poj2513Colored Sticks(无向图的欧拉回路)

1 /* 2 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 3 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 4 5 并查集判通 + 奇度节点个数等于2或者0 6 */ 7 #include<cstring> 8 #include<cstdio> 9 #include<algorithm> 10 #define N 2500005*2 11 using namespace std; 12 13 int f[N]; 1

poj1041 John&#39;s trip (无向图求欧拉回路方案)

John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5950   Accepted: 1946   Special Judge Description Little Johnny has got a new car. He decided to drive around the town to visit his friends. Johnny wanted to visit all his frien

hdu 2767 Proving Equivalences(强连通入门题)

1 /************************************************* 2 Proving Equivalences(hdu 2767) 3 强连通入门题 4 给个有向图,求至少加多少条边使得图是所有点都是强连通的 5 由a->b->c->a易知n个点至少要n条边,每个出度和入度都要大 6 于1.先求所有所有强连通分量,把每个强连通分量看成一个点 7 在找每个点的出度和入度,最后还差的出度和入度的最大值就是 8 答案. 9 10 ************

hdu 5001 walk 概率dp入门题

Description I used to think I could be anything, but now I know that I couldn't do anything. So I started traveling. The nation looks like a connected bidirectional graph, and I am randomly walking on it. It means when I am at node i, I will travel t