把欧拉路和欧拉回路做一个小总结,包含了一些题目,以后遇到新的我还会陆续加上。   

      定义: 给定无孤立结点图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记录即可。

嘿嘿,转不过来,只好贴过来了,原链接:

http://www.orzminjie.info/?p=179001