定义
欧拉路径(欧拉通路):通过图中所有边的简单路。(换句话说,每条边都通过且仅通过一次)也叫”一笔画”问题。
欧拉回路:闭合的欧拉路径。(即一个环,保证每条边都通过且仅通过一次)
欧拉图:包含欧拉回路的图。
起源
在一个图中求解一条欧拉回路的问题,起源于欧拉提出的、著名的“七桥问题”。详见百度百科。
判定
欧拉路径:
1.图G是连通的,无孤立点。
2.无向图奇点数为0或2,并且这两个奇点其中一个为起点另外一个为终点。有向图,可以存在两个点,其入度不等于出度,其中一个入度比出度大1,为路径的起点;另外一个出度比入度大1,为路径的终点。
欧拉回路
1.图G是连通的,无孤立点。
2.无向图奇点数为0;有向图每个点的入度必须等于出度。
算法
求欧拉回路的算法中,普遍使用的是Fleury算法和Hierholzer算法。由于Hierholzer算法在时间复杂度和代码实现上都更优,所以这里只介绍一下Hierholzer算法。主要是我不会敲Fleury……
Hierholzer算法思路
1.根据每个点的入度选择起点。
2.运用DFS去遍历当前节点的每一条边,之后将该节点压入栈中。
3.操作2接受后,栈中的元素就是一条欧拉回路。
附一下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define INF 0x7fffffff #define ll long long
using namespace std;
int n,m,x,y,head[1200],cnt,map[1030][1030],d[1030],begin,s[1030],t;
void dfs(int k) { for(register int i = 1; i <= n; i++) { if(map[k][i] > 0) { map[k][i] --; map[i][k] --; dfs(i); } } s[++t] = k; }
int main() { scanf("%d",&m); for(register int i = 1; i <= m; i++) { scanf("%d%d",&x,&y); map[x][y] ++; map[y][x] ++; n = max(n,x); n = max(n,y); d[x] ++; d[y] ++; } for(register int i = 1; i <= n; i++) { if(d[i] % 2 == 1) { begin = i; break; } } if(begin == 0) begin = 1; dfs(begin); for(register int i = t; i >0; i--) printf("%d\n",s[i]); printf("\n"); return 0; }
|
推荐联系题目:骑马修栅栏、无序字母对