1.定义

如果图G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路。
如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路。
具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉通路但不具有欧拉回路的图称为半欧拉图。

2. 定理及推论

欧拉通路和欧拉回路的判定是很简单的,请看下面的定理及推论。

无向图G存在欧拉通路的充要条件是:

G为连通图,并且G仅有两个奇度结点(度数为奇数的顶点)或者无奇度结点。

推论1:

1) 当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。
2) 当G是无奇度结点的连通图时,G必有欧拉回路。
3) G为欧拉图(存在欧拉回路)的充分必要条件是G为无奇度结点的连通图。

有向图D存在欧拉通路的充要条件是:

D为有向图,D的基图连通,并且所有顶点的出度与入度都相等;或者除两个顶点外,其余顶点的出度与入度都相等,而这两个顶点中一个顶点的出度与入度之差为1,另一个顶点的出度与入度之差为-1。

推论2:
1) 当D除出、入度之差为1,-1的两个顶点之外,其余顶点的出度与入度都相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为-1的顶点作为终点。
2) 当D的所有顶点的出、入度都相等时,D中存在有向欧拉回路。
3) 有向图D为有向欧拉图的充分必要条件是D的基图为连通图,并且所有顶点的出、入度都相等。

3.欧拉通路回路存在的判断

根据定理和推论,我们可以很好的找到欧拉通路回路的判断方法,定理和推论是来自离散数学的内容,这里就给出简明的判断方法:

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

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

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

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

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

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

4.欧拉回路的应用

A.哥尼斯堡七桥问题

B.一笔画问题

C.旋转鼓轮的设计

5.欧拉回路的求解

A.  DFS搜索求解欧拉回路。

基本思路:利用欧拉定理判断出一个图存在欧拉回路或欧拉通路后,选择一个正确的起始顶点,用DFS算法遍历所有的边(每一条边只遍历一次),遇到走不通就回退。在搜索前进方向上将遍历过的边按顺序记录下来。这组边的排列就组成了一条欧拉通路或回路。

 1 #include<cstdio>
 2 #include<stdio.h>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define MAX 2010
 6 using namespace std;
 7 int maps[MAX][MAX];
 8 int in[MAX];
 9 int t[MAX];
10 int flag;
11 int k;
12 int Max,Min;
13 int DFS(int x)
14 {
15     int i;
16     for(i=Min;i<=Max;i++)
17     {
18         if(maps[x][i])///从任意一个与它相连的点出发
19         {
20             maps[x][i]--;///删去遍历完的边
21             maps[i][x]--;
22             DFS(i);
23         }
24     }
25     t[++k]=x;///记录路径,因为是递归所有倒着记
26 }
27 int main()
28 {
29     int n,i,x,y;
30     Max=-9999;
31     Min=9999;
32     flag=0;
33     scanf("%d",&n);
34     for(i=1;i<=n;i++)
35     {
36         scanf("%d%d",&x,&y);
37         maps[x][y]++;
38         maps[y][x]++;
39         Max=max(x,max(y,Max));
40         Min=min(x,min(y,Min));
41         in[x]++;
42         in[y]++;
43     }
44     for(i=Min;i<=Max;i++)
45     {
46         if(in[i]%2)///存在奇度点,说明是欧拉通路
47         {
48             flag=1;
49             DFS(i);
50             break;
51         }
52     }
53     if(!flag)///全为偶度点,从标号最小的开始找
54     {
55         DFS(Min);
56     }
57     for(i=k;i>=1;i--)
58     {
59         printf("%d\n",t[i]);
60     }
61     return 0;
62 }

View Code

B.  Fleury(佛罗莱)算法

Fleury算法是对DFS爆搜的一种改进,使用DFS漫不经心的随意走是效率不高的,Fleury是一种有效的算法。

关键是能不走桥就不去走桥,实在无路可走了才去走桥!!!

 1 #include <cstdlib>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 int ans[200];
 8 int top;
 9 int N,M;
10 int mp[200][200];
11 void dfs(int x)
12 {
13     int i;
14     top++;
15     ans[top]=x;
16     for (i=1; i<=N; i++)
17     {
18         if(mp[x][i]>0)
19         {
20             mp[x][i]=mp[i][x]=0;///删除此边
21             dfs(i);
22             break;
23         }
24     }
25 }
26
27 void fleury(int x)
28 {
29     int brige,i;
30     top=1;
31     ans[top]=x;///将起点放入Euler路径中
32     while(top>=0)
33     {
34         brige=0;
35         for (i=1; i<=N; i++) /// 试图搜索一条边不是割边(桥)
36         {
37             if(mp[ans[top]][i]>0)///存在一条可以扩展的边
38             {
39                 brige=1;
40                 break;
41             }
42         }
43         if (!brige)/// 如果没有点可以扩展,输出并出栈
44         {
45             printf("%d ", ans[top]);
46             top--;
47         }
48         else     /// 否则继续搜索欧拉路径
49         {
50             top--;///为了回溯
51             dfs(ans[top+1]);
52         }
53     }
54 }
55
56 int main()
57 {
58     int x,y,deg,num,start,i,j;
59     scanf("%d%d",&N,&M);
60     memset(mp,0,sizeof (mp));
61     for(i=1;i<=M; i++)
62     {
63         scanf("%d%d",&x,&y);
64         mp[x][y]=1;
65         mp[y][x]=1;
66     }
67     num=0;
68     start=1;///这里初始化为1
69     for(i=1; i<=N; i++)
70     {
71         deg=0;
72         for(j=1; j<=N; j++)
73         {
74             deg+=mp[i][j];
75         }
76         if(deg%2==1)///奇度顶点
77         {
78             start=i;
79             num++;
80         }
81     }
82     if(num==0||num==2)
83     {
84         fleury(start);
85     }
86     else
87     {
88         puts("No Euler path");
89     }
90     return 0;
91 }

View Code

转载于:https://www.cnblogs.com/wkfvawl/p/9626163.html

欧拉回路基本概念+判断+求解相关推荐

  1. 欧拉回路基本概念及定理

    转 http://www.cnblogs.com/luyingfeng/p/3877338.html 1. 欧拉通路.欧拉回路.欧拉图 无向图: 1) 设G是连通无向图,则称经过G的每条边一次并且仅一 ...

  2. hrbust 哈理工oj 1633 word!word!【欧拉路、欧拉回路的有向图判断】

      word!word! Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 58(20 users) Total Accepted: 25 ...

  3. 逆元概念及其求解方法

    逆元 引出 存在取模运算公式: (a + b) % c = (a % c + b % c) % c (a * b) % c = (a % c * b % c) % c (a - b) % c = (a ...

  4. POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断

    没有想到网络流还能解决这一类问题,完全想不到@_@ 一开始把所有的无向边制定任意方向有当做有向边看,然后统计每个点的入度和出度.以前有向图的欧拉回路判定是每个点的入读都等于出度,这样可以保证可以回到起 ...

  5. 欧拉回路(简单判断是否有欧拉回路存在)

    https://cn.vjudge.net/contest/209173#problem/N 题目大意:给出N个点,M条边,问有没有欧拉回路存在. 题目分析:1.无向图欧拉回路是否连通2.所有点的度为 ...

  6. COMP9024笔记

    文章目录 General Question Programming in C Struct 结构体 typedef 与 #define Linked List 链表 Week 01 Introduct ...

  7. 7-32 哥尼斯堡的“七桥问题” (25 分)

    判断欧拉回路是否存在的方法 有向图:图连通,所有的顶点出度=入度. 无向图:图连通,所有顶点都是偶数度. 推荐一篇博文,感觉很好---->欧拉回路基本概念+判断+求解 首先判断图是否联通,如果不 ...

  8. 欧拉路和欧拉回路知识

    概念 如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path). 如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit). [1] 具有欧拉回路的图称为欧拉图 ...

  9. 神经网络概念解释和特点,神经网络概念解释大全

    什么叫神经网络? 南搞小孩给出基本的概念:一.一些基本常识和原理[什么叫神经网络?]人的思维有逻辑性和直观性两种不同的基本方式. 逻辑性的思维是指根据逻辑规则进行推理的过程:它先将信息化成概念,并用符 ...

最新文章

  1. 统计简单学_正态分布
  2. 计算两个日期之间的年数
  3. 今日 Paper | 新闻推荐系统;多路编码;知识增强型预训练模型等
  4. 关于 Visual Studio 2010
  5. 矩阵sum_推荐系统——从协同过滤到矩阵分解
  6. opengl加载显示3D模型RAW类型文件
  7. 7号团队-团队任务3:每日例会(2018-11-29)
  8. 你知道K8S暴露服务的方式有哪些吗?
  9. java 元类_[译]什么是元类metaclass?
  10. EntityFramework Codefirst Select 查询指定列
  11. 软件安装及软件包管理
  12. webservice 实例 创建与 调用
  13. MyBatis逆向工程
  14. python判断字符串大小写的三大函数——islower、isupper、istitle函数的用法及实例
  15. 计算机《画图》教案学生状态,电脑画图教案.doc
  16. 解决thinkpad或者其他笔记本电脑无线网络不可用问题
  17. c51单片机烧录程序 控制台显示正在检测目标单片机
  18. sdlc 瀑布式 生命周期_管理信息系统中的SDLC瀑布模型
  19. 链接预测(Link Prediction)
  20. 神经网络epoch和batch的粗浅理解

热门文章

  1. DataView.RowFilter的使用(包括in,like等SQL中的操作符)
  2. CSS中id选择器和class选择器
  3. 马氏距离详解(数学原理、适用场景、应用示例代码)
  4. matlab编程进行卡尔曼滤波的简单例子
  5. 数字图像处理--图像增强之对比度拉伸
  6. 11054 - Wine trading in Gergovia
  7. Huffman编码解码
  8. 从JVM的角度看JAVA代码--代码优化
  9. python二进制创建写模式_30 个Python代码实现的常用功能,精心整理版
  10. java 苹果h5不能播放_H5音频不能自动播放的问题