如何判断无向图是否存在偶环
注:本博客只探索是否存在偶环,不能求出偶环数量,也不能输出偶环包含哪些点。
网上一搜“图论如何判断偶环”,搜出来的全是“图中是否存在环”,只能说对于大学生来说普及的算法止步于此了,谔谔。
但是只要是接触过一点ACM的同学应该都会判断是否存在奇环,无论是有向图还是无向图,判断奇环只需要二分图染色就行了。
那偶环有什么不一样的?为什么不能二分图染色做?
如果一张无向图没有偶环,那么自然是二分图染色找不到的,但一张存在偶环的图,二分图染色有可能也找不到,这个和DFS的顺序有关。
如下(是无向图,箭头仅表示遍历方向):
虽然一眼存在偶数环,但是绿线是我们DFS的顺序,蓝线是用于判断成环的线,通过黄白染色,发现所有成环的线构成的环都是奇数环,也就是没有发现偶数环。
解决方法应该有很多,这里讲一个最简单的判断方法(只适用于无向图,不考虑重边)。
偶数环的定义有两种:
1、n为偶数,将n个不同的点串起来的环。
2、n为偶数,用n个不同的边串起来的环(允许经过同一个点多次)。
第二种环比第一种环条件要弱,数量要多。
第一种偶环:
判断方式很简单,无向图连通性的所有问题基本都能用圆方树解决,我们构造出一棵圆方树。
结论1:如果一个点双有偶数(>2)个点,那么一定存在偶环。(结论显然)
结论2:如果一个点双有奇数个点,但是边数大于点数,那么一定存在偶环。(因为多出来的任一条边可以把奇环割成一个奇环和一个偶环)
用这两个结论即可判断一个点双是否存在偶环。点双内点数就是方点的度数,边数可以将方点连接的圆点打上标记然后DFS一遍求出。
这里有一道例题:https://codeforces.com/gym/103931/problem/J,但是除了判断偶环以外还有很多恶心的分类讨论,慎做。
第二种偶环:
判断范围从点双变成了边双,点双里的偶环在边双里也一定是偶环,第二种偶环无非是多出来了以下情况:
结论3:一个边双内如果存在割点,那么一定存在第二种偶环。
证明:割点将一个边双分成了两个点双,如果任意一个点双有偶数个点,那么点双内存在偶环,如果两个点双都是奇数个点,那么大环的边数是偶数。
怎么判断边双内是否存在割点呢,非常简单,遍历圆方树内每一个割点(连接至少两个方点的圆点),如果割点连接的方点中,至少有两个不是桥,那么这个割点就是边双内的割点。
将结论3与第一种偶环综合起来,就可以判断是否有第二种偶环了。