这题实际上是判断图是否为二分图,可以假设此图为连通图(非连通图时对其各个连通分支作相同操作即可)。
二分图的充要条件是“所有环路的长度均为偶数”,刚开始我也从这方面着手,努力证明如果此图有环路,则环路长度不可能为奇数,继而发现此路不通,而且如果为二分图还要输出结点的两个部分,这种方法比较困难,使用以下方法证明。
对任意一个结点使用BFS,BFS树的根结点设置为红色,与根结点距离为奇数的点设置为黑色,距离为偶数的点设置为红色(对于BFS树来讲,可以按照树结点的层数来进行,当前层为红色,则下一层结点为黑色,确保BFS树中相邻结点的颜色不相同),于是将此图的点分成了红、黑两种颜色,再查看一下所有边的集合,如果存在某条边的两个点颜色相同则此图不是二分图,否则此图为二分图,而且此算法已经将图的结点分成了不相交的两个部分了。
上述算法中还需要证明,“如果存在某条边的两个点颜色相同则此图不是二分图”,即无论如何划分都不能将此图二分。假设这两个点为u,w,其颜色相同,则边(u,v)必定不属于BFS树,这是由BFS 的过程保证的,边(u,v)和BFS树中u到v的通路构成一个环,除了u、v这一对相邻的结点颜色相同为,剩余所有相邻结点颜色均不相同,则此环的长度必为奇数,故不可能是二分图,命题得证。
这种构造证明方法,相当于对二分图的“充分条件”进行了构造性证明,即如果图只有路径为偶数的环路,则此图必为二分图。
本文介绍了一种通过广度优先搜索(BFS)来判定图是否为二分图的方法,并在此基础上实现图的划分。该方法通过对图进行染色来验证是否存在长度为奇数的环路,进而判断图是否能被正确划分为两个不相交的部分。

被折叠的 条评论
为什么被折叠?



