欧拉环路与欧拉路径

一、欧拉路径与欧拉环路

通俗地说,对于一个图的某条路径,如果能从一个点出发将这个图的所有边都不重复地走一遍,那么这条路径就被称为欧拉路,即小时候玩的一笔画问题;对于一个图的某条路径,如果能从一个点出发将这个图的所有边都不重复地走一遍并回到起点,那么这条路径就被称为欧拉回路。

1.问题概述

1.1 定义
如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。
如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。
具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。

2. 求解算法思想

2.1 判定

1.无向图欧拉回路的判定:图G为连通图,所有顶点的度为偶数。
2.无向图欧拉路径的判定:图G为连通图,除有2个顶点度为奇数外,其他顶点度都为偶数。
3.有向图欧拉回路的判定:图G的①基图联通,所有顶点的入度等于出度。
4.有向图欧拉路径的判定:图G的基图联通,存在顶点u的入度比出度小1,v入度比出度大一,其余所有顶点的入度等于出度。(此时u即路径的起点,v即终点)
5.无孤立点的有向图 G 为欧拉图,当且仅当图 G 弱连通且所有顶点的入度等于出度。
6.对于连通有向图,所有顶点入度与出度差的绝对值之和为 2k ,则图 G 可以用 k 条路径将图 G 的每一条边经过一次,且至少要使用 k 条路径

2.2 Hierholzier 算法

2.2.1 算法流程
任选一起点,沿任意未访问的边走到相邻节点,直至无路可走。此时必然回到起点形成了一个回路,此时图中仍有部分边未被访问。在退栈的时候找到仍有未访问边的点,从该点为起点求出另一个回路,将该回路与之前求出的回路拼接。如此反复,直至所有的边都被访问。

2.3 Fluery 算法

2.2.1 算法流程
在这里插入图片描述

3. 举例说明求解过程

3.1 Hierholzier算法

在这里插入图片描述
在这里插入图片描述

3.2 Fluery算法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 例题

题目背景
Farmer John 每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。

题目描述
John 是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。
John 的农场上一共有m个栅栏,每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有那么多个顶点)。一个顶点上至少连接1个栅栏,没有上限。两顶点间可能有多个栅栏。所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。John 能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。
你需要求出输出骑马的路径(用路上依次经过的顶点号码表示),使每个栅栏都恰好被经过一次。如果存在多组可行的解,按照如下方式进行输出:如果把输出的路径看成是一个500 进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个 (也就是输出第一位较小的,如果还有多组解,输出第二位较小的,以此类推)。
输入数据保证至少有一个解。

输入格式
第一行一个整数m,表示栅栏的数目。
从第二行到第(m+1)行,每行两个整数u,v,表示有一条栅栏连接u,v两个点。

输出格式
共 (m+1)行,每行一个整数,依次表示路径经过的顶点号。注意数据可能有多组解,但是只有上面题目要求的那一组解是认为正确的。
数据保证至少有一组可行解。

输入输出样例
输入
9
1 2
2 3
3 4
4 2
4 5
2 5
5 6
5 7
4 6
输出
1
2
3
4
2
5
4
6
5
7

解题思路
这个题是欧拉回路的模板题,那么在这里给出一个hierholzer的做法。
对于求欧拉回路的问题,有Fluery算法和Hierholzers算法,两种算法。
后面一种算法无论是编程复杂度还是时间复杂度好像都比前种算法复杂度更优,但前者的应用广泛性好像比后者更高。
对于Hierholzers算法,前提是假设图G存在欧拉回路,即有向图任意 点的出度和入度相同。从任意一个起始点v开始遍历,直到再次到达 点v,即寻找一个环,这会保证一定可以到达点v,因为遍历到任意一 个点u,由于其出度和入度相同,故u一定存在一条出边,所以一定可 以到达v。将此环定义为C,如果环C中存在某个点x,其有出边不在环 中,则继续以此点x开始遍历寻找环C’,将环C、C’连接起来也是一个 大环,如此往复,直到图G中所有的边均已经添加到环中。

4. 算法具体步骤

4.1 Hierholzier

4.1.1 主要算法的伪代码

While s存在未被删除的无向边(s,t){
    delete(s,t); //删除(s,t)
    Hierholzer(t);}
cnt += 1;
Path[cnt] = s;

5. 性能分析

时间复杂度为O(M)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值