欧拉回路

欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。

判断欧拉路是否存在的方法  

  有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。

  无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。

  

  定理:无向图G具有一条欧拉路,当且仅当G是连通的,且有0个或者是两个奇数度得结点。  

  推论:无向图G具有一条欧拉回路,当且仅当G是连通的,并且所有结点的度数均为偶数。

 

判断欧拉回路是否存在的方法  

  有向图:图连通,所有的顶点出度=入度。

  无向图:图连通,所有顶点都是偶数度。

 

  定理:有向图G具有 单向欧拉路,当且仅当它是连通的,而且除两个结点外,每个结点的入度等于出度,但这两个结点中,一个结点的入度比出度大1,另一个结点的入度比出度小1。  

  定理:有向图G具有一条单向欧拉回路,当且仅当是连通的,且每个结点入度等于出度。

 

  程序实现一般是如下过程:

  1.利用并查集判断图是否连通,即判断p[i] < 0的个数,如果大于1,说明不连通。

  2.根据出度入度个数,判断是否满足要求。

  3.利用dfs输出路径。

 

  找欧拉回路:根据DFS(边)的性质,回溯是记录,可以求出欧拉回路。有向图与无向图的区别就是在DFS时,要标记的边,有向图标记一条就足以,而无向图需要将两条都标记。找欧拉通路原理与回路相同,代码也相同。

 1 #include<iostream>
 2 #include <cstring>
 3 #include<queue>
 4 using namespace std;
 5
 6 int first[100];
 7 int next[100];
 8 int v[100];
 9 int d[100];
10 int vis[100];
11 int times;
12 int n,m;
13
14 void dfs(int start)
15 {
16     int i,j,k;
17     for(k=first[start]; k!=-1; k=next[k])
18     {
19         if(vis[k]==0)
20         {
21             vis[k]=1;
22             dfs(v[k]);
23             int temp1=k%m;
24             if(k%m==0)
25                 temp1=m;
26             d[times++]=temp1;
27         }
28     }
29 }
30 int main()
31 {
32     int i,j,k;
33     while(cin>>n>>m)
34     {
35         memset(first,-1,sizeof(first));
36         memset(next,-1,sizeof(next));
37         memset(vis,0,sizeof(vis));
38         times=1;
39         d[0]=-1;
40         int temp1,temp2,temp3;
41         for(i=1; i<=m; i++)
42         {
43             cin>>temp1>>temp2;
44             if(first[temp1]==-1)
45             {
46                 first[temp1]=i;
47             }
48             else
49             {
50                 temp3=first[temp1];
51                 first[temp1]=i;
52                 next[i]=temp3;
53             }
54             v[i]=temp2;
55         }
56         dfs(1);
57         for(i=1; i<times; i++)
58             cout<<d[i]<<" ";
59         cout<<endl;
60     }
61     return 0;
62 }
63   

 

时间: 2024-09-24 16:12:48

欧拉回路的相关文章

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

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

UVa 10054:The Necklace, 欧拉回路+打印路径

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=995 题目类型: 欧拉回路 题目: My little sister had a beautiful necklace made of colorful beads. Two successive beads in the necklace sha

UVa 10596:Morning Walk, 赤裸裸的欧拉回路

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=1537 题目类型: 欧拉回路, 并查集, dfs 题目: Kamal is a Motashota guy. He has got a new job in Chittagong. So, he has moved to Chittagong fr

九度题目1027:欧拉回路

题目1027:欧拉回路 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2344解决:1157 题目描述:     欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? 输入:     测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M:随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号).当N为0时输入结束. 输出:

poj 1386 Play on Words(有向图欧拉回路)

/* 题意:单词拼接,前一个单词的末尾字母和后一个单词的开头字母相同 思路:将一个单词的开头和末尾单词分别做两个点并建一条有向边!然后判断是否存在欧拉回路或者欧拉路 再次强调有向图欧拉路或欧拉回路的判定方法: (1)有向图G为欧拉图(存在欧拉回路),当且仅当G的基图连通,且所有顶点的入度等于出度. (2)有向图G为半欧拉图(存在欧拉道路),当且仅当G的基图连通,且存在顶点u的入度比出度大1.v的入度比出度小1, 其它所有顶点的入度等于出度(顶点u,v的个数必须都是1). 求该图的连通性的时候,只

hdu 1878 欧拉回路

点击打开链接hdu 1878 思路: 欧拉回路 分析: 1 首先题目给定的是一个无向图,所以我们判断该图是欧拉图的条件是图是否是连通的并且所有点的度都是偶数 2 很明显度数很好判断,而图是否连通通过并查集 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 1010; int fa

请问C++数据结构中哈密尔顿回路和欧拉回路算法有什么区别?欧拉回路的算法

问题描述 请问C++数据结构中哈密尔顿回路和欧拉回路算法有什么区别?欧拉回路的算法 请问C++数据结构中哈密尔顿回路和欧拉回路算法有什么区别?欧拉回路的算法 解决方案 欧拉回路说白了就是一笔画问题的判定,关键是求每个顶点的度数 http://blog.163.com/zhoumhan_0351/blog/static/39954227200982051154725/ 解决方案二: 欧拉回路Fleury算法算法学习之欧拉回路数据结构与算法问题 欧拉回路

POJ 1780 Code:十进制格雷码&amp;amp;欧拉回路

Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need a key but you are required to enter the correct n-digit code on a keypad (as if this were something new!). There are severa

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford