欧拉图的新娘
所以我希望你不是为了别人而选择,而是思考自己想怎么做。——《魔法使的新娘》
你看这个欧拉图,就像森林一样。
欧拉图
欧拉图是指通过图(无向图或有向图)中所有边且每边仅经过一次通路,相应的回路成为欧拉回路,具有欧拉回路的图叫做欧拉图,具有欧拉路径而无欧拉回路的图称为半欧拉图,两张半欧拉图就可以合成一个欧拉图。欧拉图现代的扩展是蜘蛛图(也就是雷达图),它向欧拉图增加了可以连接的存在点。之前欧拉图只有合取特征(就是区定义了有着与起来的那些性质的对象在区中的存在,但是这和我们没有关系),这给予了它析取特征。
也可以说欧拉图就是从任意一个点开始都可以一笔画完整个图,半欧拉图必须从某个点开始才能一笔画完整个图。
欧拉图的诞生源于柯尼斯堡(加里宁格勒)的一条普雷格尔河,你听说过七桥问题吗?
好了你已经可以解决七桥问题了,这篇文章就这么结束吧。
七桥问题
世纪东普鲁士的柯尼斯堡,有一条河穿过了全城,河上有两个小岛,有七条桥把两个岛与河岸联系起来,一个不行者怎样才能不重复,不遗漏的一次走完七条桥,最后回到出发点。 那么我们的欧哥基于此提出了我们都玩过的“一笔画”,也就是欧拉回路。
当然已经在
世纪的我们知道应该是不可能的了基本大概。
给出一张欧拉图:
发现什么了吗?
不行,如果你没发现我也要告诉你了,我们可以发现欧拉图的一些性质(诶我没告诉你是要找性质吗)。
比较可以看出来的就是欧拉图里点的度数都是偶数,因为进出次数一定相等。
那么我们不一定可以知道半欧拉图是恰有
在欧拉图中,当所有顶点属于同一个强连通分量的时候,每个顶点的入度和出度是相同的。但是半欧拉图果然是不同于欧拉图,将半欧拉图中的有向边退化成无向边的时候,这张图的所有点属于一个强连通分量,除了两个顶点外,其余顶点的出度和入度都是相等的,那两个顶点中一个顶点的入度和出度差为
通过图中所有边恰好一次且行遍所有顶点的通路为欧拉路径(也可以叫做欧拉通路)。
欧拉回路
Fleury
也称避桥法,是一种比较暴力的算法,时间复杂度为糟糕的
算法流程是每次选择下一条边的时候优先选择不是桥的边。
一个比较错误的方式就是先
Hierholzer
是逐步插入回路法,又叫圈套圈算法。
算法流程是从一条回路开始,每次任取一条目前回路中的点,将其替换成一条简单回路,以此寻找到一条欧拉回路,如果从路开始的话,就可以寻找到一条欧拉路径。
开始时任选
代码如下:
1 | void Hierholzer (int p) |
找张图来模拟一下过程:
假设我们现在从
那么往后退到
蓝色表示一条回路但是走到底了走不了了。
当然也可以写成邻接矩阵的形式:
1 | void Hierholzer (int p) |