判断一个图是否为二分图且输出结点二分的两个部分(算法导论22.2-6)

这题实际上是判断图是否为二分图,可以假设此图为连通图(非连通图时对其各个连通分支作相同操作即可)。

二分图的充要条件是“所有环路的长度均为偶数”,刚开始我也从这方面着手,努力证明如果此图有环路,则环路长度不可能为奇数,继而发现此路不通,而且如果为二分图还要输出结点的两个部分,这种方法比较困难,使用以下方法证明。

对任意一个结点使用BFS,BFS树的根结点设置为红色,与根结点距离为奇数的点设置为黑色,距离为偶数的点设置为红色(对于BFS树来讲,可以按照树结点的层数来进行,当前层为红色,则下一层结点为黑色,确保BFS树中相邻结点的颜色不相同),于是将此图的点分成了红、黑两种颜色,再查看一下所有边的集合,如果存在某条边的两个点颜色相同则此图不是二分图,否则此图为二分图,而且此算法已经将图的结点分成了不相交的两个部分了。

 

上述算法中还需要证明,“如果存在某条边的两个点颜色相同则此图不是二分图”,即无论如何划分都不能将此图二分。假设这两个点为u,w,其颜色相同,则边(u,v)必定不属于BFS树,这是由BFS 的过程保证的,边(u,v)和BFS树中u到v的通路构成一个环,除了u、v这一对相邻的结点颜色相同为,剩余所有相邻结点颜色均不相同,则此环的长度必为奇数,故不可能是二分图,命题得证。

 

这种构造证明方法,相当于对二分图的“充分条件”进行了构造性证明,即如果图只有路径为偶数的环路,则此图必为二分图。

你可能感兴趣的:(判断一个图是否为二分图且输出结点二分的两个部分(算法导论22.2-6))