对于欧拉回路/欧拉路的分析及论证
摘要:随着科技的发展,图论在生活中的应用越来越广泛,本文研究了欧拉回路/欧拉路的基本原理并进行了论证,并且给出了求解欧拉回路/欧拉路的算法
关键词:欧拉路。欧拉回路,欧拉图,半欧拉图,欧拉迹
引言:图论在生活中有者许多应用,其中欧拉图更是扮演着重要的角色,欧拉图的判定是欧拉图研究的基础,对于一笔画等问题,均可用欧拉图的知识进行解决。
1.七桥问题(Seven Bridges Problem)
18世纪初普鲁士的哥尼斯堡,有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系起来(如右上图)。有个人提出一个问题:一个步行者怎样才能不重复、不遗漏地一次走完七座桥,最后回到出发点。后来大数学家欧拉把它转化成一个几何问题——一笔画问题。当欧拉在1736年访问普鲁士的哥尼斯堡(现俄罗斯加里宁格勒)时,他发现当地的市民正从事一项非常有趣的消遣活动。哥尼斯堡城中有一条名叫Pregel的河流横经其中,这项有趣的消遣活动是在星期六作一次走过所有七座桥的散步,每座桥只能经过一次而且起点与终点必须是同一地点。欧拉把每一块陆地考虑成一个点,连接两块陆地的桥以线表示。后来推论出此种走法是不可能的。他的论点是这样的,除了起点以外,每一次当一个人由一座桥进入一块陆地(或点)时,他(或她)同时也由另一座桥离开此点。所以每行经一点时,计算两座桥(或线),从起点离开的线与最后回到始点的线亦计算两座桥,因此每一个陆地与其他陆地连接的桥数必为偶数。七桥所成之图形中,没有一点含有偶数条数,因此上述的任务无法完成。欧拉的这个考虑非常重要,也非常巧妙,它正表明了数学家处理实际问题的独特之处——把一个实际问题抽象成合适的“数学模型”。这种研究方法就是“数学模型方法”。这并不需要运用多么深奥的理论,但想到这一点,却是解决难题的关键。
(该部分引用自百度百科https://baike.baidu.com/item/%E4%B8%83%E6%A1%A5%E9%97%AE%E9%A2%98/2580504?fr=aladdin)
2.欧拉图(Euler Graph)与欧拉回路(Euler Circuit)
定义1: 给定无孤立点图G,若存在一条回路,经过途中的每一条边一次且仅一次,则该回路为欧拉回路,具有欧拉回路的图称为欧拉图,若存在一条迹,经过途中每条边一次且仅一次,该条路称为欧拉迹。
定理1: 图G是欧拉图当且仅当G是连通的且每个节点的度数均为偶数。
证明1: 设无向图G,a为其一条欧拉回路。
必要性:当a通过G的任一节点v时,a通过关于v的两条边,若a通过v点k次,则a通过关于v的2k条边,又由定义得,2k条边必不相同,则v的度数为偶数,由任意性的必要性成立。
充分性:设G的每个节点的度数均为偶数,由于G连通,则G中必然存在一条回路(环)G1,将G1从G中删除得到G’,则易得G’中所有点仍为偶数度节点,则G’中同样存在回路G2……重复上述操作直至删除G中所有边,得到一系列回路,且G1,G2……至少有一公共点,则得到由G1,G2……构成的一条欧拉回路。
推论1: 连通图G是半欧拉图,当且仅当G恰有两个奇数度节点,且图中的欧拉迹一定始于一个奇数度节点而止于另一个奇数度节点。
证明1’:对于两个奇数度节点,连上一条边,则可得G’中所有节点度数均为偶数为一条欧拉回路,再删除那条边得到一条欧拉迹。
定义2: 给定有向图,通过图中每边一次且仅一次的一条有向回路称为有向欧拉回路(欧拉迹),如果有向图G具有一条有向欧拉回路(欧拉迹),则称G为有向欧拉图(半欧拉图)。
定理2: 有向图G为有向欧拉图,当且仅当是连通的,且每个节点入度等于出度,有向图G为半欧拉图,当且仅当G是连通的,且除两个节点外,每个节点入度等于出度,但这两个节点中,一个节点入度比出度大1,另一个节点出度比入度大1。
证明2:
对于欧拉回路:
充分性:若有向图G有欧拉回路,对于任意一点v,假设其入度x不等于出度y(不妨设x>y),则第x+1次访问v后,不能够再次回到v,则与其关联的x-y条边不能被访问,假设不成立,则必要性成立
必要性:设有向图G所有点入度等与出度,从出发点s出发,得到一条通路s->v1->v2->……->vi,对于vi,若其不等于s,则易知进入vi的次数比走出vi的次数多1,那么必然有一条关于vi的出边未被访问,则路径未完,有G为有限图,则必然存在vi=s使其成为回路,即得证。
对于欧拉迹:
类似于证明1’,此处省略。
3.欧拉图判定与求解
欧拉图的判定:
首先,利用dfs判断图是否连通。
其次,对于无向图,统计每个点的度数,若度数均为偶数则存在欧拉图,否则如果仅有两个奇数度节点,则存在半欧拉图。
对于有向图,统计每个点的入度与出度,如果所有点的入度等与出度,则存在有向欧拉回路,否则如果有且仅有两个节点入读不等与出度,若其中一个节点入度比出度大1,另一个节点出度比入度大1,则存在半欧拉图。
欧拉路/欧拉回路的求解:
对于无向图:
1.无奇数度节点,从任意节点出发进行dfs,找到一条通路。
2.有奇数度节点,从任意奇数度节点出发进行dfs,找到一条通路。
对于有向图:
1.所有点的入度等与出度,从任意节点出发进行dfs,找到一条通路。
2.否则从入度比出度大1的节点出发进行dfs,找到一条通路。
代码实现(部分):
const int maxn = 1010; //定义最大节点数(可修改)
bool G[maxn][maxn]; //邻接矩阵存图
int degree[maxn]; //记录节点度数(无向图)
int in