欧拉图详解
通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次且仅一次行遍所有顶点的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。
1 定义
欧拉通路(Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。
欧拉回路 (Eulercircuit)——通过图中每条边一次且仅一次,并且过每一顶点的回路。
2 无向图是否具有欧拉通路或回路的判定
G有欧拉通路的充分必要条件为:G 连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。
G有欧拉回路(G为欧拉图):G连通,G中均为偶度顶点。
3 有向图是否具有欧拉通路或回路的判定
D有欧拉通路:D连通,除两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1。
D有欧拉回路(D为欧拉图):D连通,D中所有顶点的入度等于出度。
(注意:这里说有向图连通,说的是有向图是弱连通图。即把有向图中的边变成无向边,只要该图连通,那么原有向图即是弱连通图。实际中可用并查集判断是否弱连通)
注意下面打印节点的代码,其实打印欧拉路径的节点轨迹可以先打印每条欧拉路上的边,然后取每条边的头结点即可(最后一条边还需要取尾部结点)。
对于一般的单词首尾相连的问题,一般都是转化为有向图的欧拉通路问题(而不是无向图),比如”给你多个单词,问你能不能将所有单词组成这样一个序列:序列的前一个单词的尾字母与后一个单词的头字母相同”,如果你把每个单词看出无向的边,那么最终求出的欧拉通路可能存在两个单词尾部和尾部相连的情况。
无向欧拉图(半欧拉图)逆序打印欧拉回路或通路代码:
有向欧拉图(半欧拉图)逆序打印欧拉回路或通路代码:
欧拉图应用
POJ 2513 Colored Sticks(欧拉回路判断+字典树Trie+并查集):其实就是判定是否存在欧拉图,首先欧拉图必须连通,所以需要用并查集。然后本图中的每个节点是一个单词,所以需要用单词映射成节点编号(用map<string,int>映射可能会超时),所以需要用字典序映射。解题报告!
POJ 1041 John's trip(欧拉回路+输出路径):输出字典序最小的欧拉回路。解题报告!
POJ 2337 Catenyms(有向欧拉图:输出欧拉路径):有向图输出字典序最小的欧拉路径。解题报告!
POJ 1300 Door Man(欧拉回路判定):判断无向图是否存在欧拉通路。解题报告!
POJ 2230 Watchcow(欧拉回路:输出点轨迹):输出有向图的欧拉回路点轨迹。解题报告!
POJ 1386 Play on Words(判定图欧拉通路是否存在):有向图欧拉道路问题。解题报告!
HDU 1878 欧拉回路(简单欧拉回路判定):简单无向图欧拉问题判定。解题报告!
HDU 3018 Ant Trip(欧拉回路:一笔画问题):给你一个无向的欧拉图,你需要几笔才能一笔画完整个图?解题报告!