是什么
如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。
如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。
具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。
——摘自百度百科
其实就是 一笔从起点经过所有边到达终点(欧拉路) 和 一笔从起点经过所有边回到起点(欧拉回路)
对于是否有回路的判定
1.无向图
结论
度数为偶数
证明
为了使形成回路,必定进入节点后,必须出去连接下一点(也就是说,进入节点多少次,就要出节点多少次)。
如果存在奇数条边,那么,必定总有一条边只可以进入节点而不可以出去和其他节点连接,就导致不可以构成回路。
2.有向图
结论
出度与入度相等
证明
同理,多少边进入,就要有多少边出去。
关于欧拉路径
和回路类似,无向图中,除原点(起点)和汇点(终点)是奇数条边,其余度数全都是偶数。
求欧拉回路&判断
原理
循环枚举找出发点。
具体步骤
- 遍历到一点,加入路径
- 找到子节点,入栈
- 出栈,加入路径,删去刚刚走过的边
- 判断栈是否为空,否-执行3,是-执行2
- 所有边遍历完毕或无法再次遍历边,结束算法
例题
- 洛谷P2731 骑马修栅栏 Riding the Fences
模板,稍微改一下,原理一样 - 洛谷P1341 无序字母对
每两个字母连一条无向边,再求欧拉回路
洛谷P2731 骑马修栅栏 Riding the Fences
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1031;
int n,m;
int a[maxn][maxn], du[maxn];
stack<int> S;
void dfs(int i){
for(int j=1; j<=n; j++){
if(a[i][j])
{
a[i][j]--;
a[j