把欧拉路和欧拉回路做一个小总结,包含了一些题目,以后遇到新的我还会陆续加上。
定义: 给定无孤立结点图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在
一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。
关于欧拉路和欧拉回路定义及存在证明请看这里。 这里给出欧拉路和欧拉回路存在条件的结论:
存在欧拉路的条件:
无向图: 图连通,所有点都是偶数度,或者只有两个点是奇数度。当所有点是偶数度时欧拉路起点可以是任意
点;当有两个奇数度点时起点必须是奇数度点。
有向图: 图连通,所有点出度=入度,或者有一个点入度-出度=1,有一个点出度-入度=1。同样,当所有点
出度=入度时任意点可作为起点;而后者必须以出度-入度=1的点做起点,入度-出度=1的点做终点。
存在欧拉回路的条件:
无向图: 图连通,所有点都是偶数度
有向图: 图连通,所有点出度=入度
混合图: 构造网络流模型来进行判断,具体如下:
先对原图中的无向边随便定向,然后计算每个点的出度和入度,如果存在|出度-入度|为奇数的点,则
不存在欧拉回路(因为欧拉回路要求每个点出度=入度,而对无向图随便定向不影响点的 |出度-入度|
的奇偶性,所以如果存在这样的点,不论怎么样都不可能找到欧拉回路);否则,对于每个点来说,
求出它的|出度-入度|/2,得到X。然后开始构造网络:原图中的无向边怎么定向,网络中就怎么连边,
容量为1;然后对于每个点,如果(出度-入度)大于0,就和源点连边,容量为X;如果(出度-入度)大于0,
就和汇点连边,容量为X;然后对这个网络求最大流,如果能够满流,则原图存在欧拉回路,否则不存
在。
证明:每个点的出度和入度之差|出度-入度|,需要改变它的一半,即X条与之相接的边来调节使之出
度=入度(因为改变1条边使得出入度之差改变2);对于出度大于入度的点和源点连边,相当于
这些点提供出度;对于入度大于出度的点,和汇点连边,相当于接受出度;那些无向边随便定
向,容量为1,表示它们可以改变方向。如果能够满流,说明可以通过调节无向边方向得到欧
拉回路,流量为1表示改变一条边的方向。那么怎么得到这个图的欧拉回路呢?我们知道,流
量为1表示需要改变它的方向,所以最后的欧拉回路即是求图G的欧拉回路,图G为原图的有向
边+网络中流量为0的边+网络中流量为1的边的反向。
这些结论的证明都不难,大家还是好好想一想为什么,这对于问题的求解很有帮助。
关于这部分知识的题目主要有以下几类:一笔画问题(HDU3018);欧拉路、欧拉回路存在性问题
(POJ2513, POJ1386, POJ1637);寻找一条欧拉路、欧拉回路问题(HDU2894,POJ2230, POJ2337,
POJ1392,POJ1041),有时会要求字典序最小什么的。其中,模型的建立和构图是最重要的。
HDU3018 Ant Trip 给定一个无向图G,问最少需要几笔画完。
解法:对于每一个连通分量,如果所有点都是偶数度,需要一笔画完(即欧拉回路),否则需要奇数度点个数的
1/2,注意忽略孤立点。证明很简单,自己想~
POJ2513 Colored Sticks 给定N个棍子(N < 250,000),每个棍子两头有两个颜色,如果两个棍子在某一个
端点颜色相同,则可以连接,问能否把N各棍子连接为一条?
解法:很裸的欧拉路判断问题,判断一下连通性和点的度就好了,需要注意不能用map,会超时,必须用trie。
POJ1386 Play on words 给定N个单词,问是否能否按照规定排成一排,两个单词iff有相同端点才可以挨着。
如acm,go,micolog,就可以按照acm->micolog->go排成一列。
解法:这是个老题了,在OI论文里也有提过,构图是一个亮点。我们把单词当做边,把第一个和最后一个字符
当做点连边。比如acm就让a和c连边,然后只需判断是否存在欧拉路即可。
证明:N个单词按照如上构图可以得到一个有N条边的有向图,如果这个图存在欧拉路,如上边的例子,
存在a->m->g,我们就可以知道a开头,m结尾的单词是排列的第一个,m开头g结尾的是第二
次,以此类推。所以这个构图时合理的。而如果把单词做点的话这个题的意思便是求汉密尔顿路,
明显不如这样简单直观。
POJ1637 Sightseeing tour 裸的混合图的欧拉回路,判断是否存在,按上面提到的方法构造网络判断满流即可。
HDU2894 DeBruijin DeBruijin图问题,给定一个数N,求一个长为2^N的01串,使得任意N个子串表示0到
2^N-1所有的数恰好一次,且要求字典序最小。
解法:直接DFS找即可,每次按照先添加0再添加1的顺序找到未标记的数,然后标记接着DFS,最后逆序输出。
POJ2230 Watchcow 给定一个无向图,保证存在欧拉路,找到一条欧拉路,输出点的访问顺序。
解法:直接DFS即可,由于没有要求,可以不记录结果直接在DFS过程中输出(是逆序的)即可。
POJ1041 John’s trip 给定一个有向图,如果存在欧拉路的话输出边的访问顺序。
解法:DFS,中间记录结果。注意输出边的顺序和输出点的顺序的不同。
POJ2337 Catenyms 和POJ1386一样的题意,但是要求把最后的结果输出且要求字典序最小。
解法:每条边保存起点,终点和相应的单词,先判断是否存在,如果存在的话,把所有的边按照单词进行排
序,然后DFS+回溯找到欧拉路。具体看代码。
POJ1392 Ouroboros Snake 和HDU2894几乎一样的题目,给出N个K,找出长度为N时串的第K个数。
解法:和HDU2894一样DFS记录即可。
嘿嘿,转不过来,只好贴过来了,原链接: