如何在有向图中测试二分图

时间:2015-11-22 17:22:21

标签: algorithm optimization graph bipartite

虽然我们可以在任何给定的无向图上使用BFS和DFS(2着色)检查图是否为二分图,但相同的实现可能不适用于有向图。

因此,为了在有向图上对其进行测试,使用我的源图G1构建新的无向图G2,使得对于每个边E [u - > v]在G2中添加边缘[u,v]。

因此,通过应用2着色BFS,我现在可以发现G2是否是二分的。 同样适用于G1,因为这两者在结构上是相同的。但是这种方法成本很高,因为我使用了额外的图形空间。虽然这足以满足我目前的目的,但我想知道是否有更好的实现。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以执行算法以在有向图上找到无向图的2分区,您只需要稍微扭曲一下。 (顺便说一句,在下面的算法中,我假设你最终会找到一个2色。如果没有,那么你将遇到一个已经着色的节点,你发现你需要将它着色为另一种颜色。然后你就退出说它不是二分的。)

从任何节点开始,并通过遍历边缘进行2着色。如果您遍历了图中的每个边缘和每个节点,那么您就拥有了分区。如果没有,那么你有一个2色的组件,没有边缘离开组件。选择不在组件中的任何节点并重复。如果你遇到一些情况,当你有一些全部为2色的组件,并且没有任何边缘留下任何一个,你会遇到一个源自组件中的节点的边缘你当前正在构建并进入上一个组件中的一个节点,然后您只需将当前组件与旧组件合并(并且可能需要翻转其中一个组件中每个节点的颜色 - 在较小的组件中翻转它) 。合并后继续。您可以进行合并,因为在合并时您只扫描了两个组件之间的一条边,因此翻转其中一个组件的颜色会使您处于有效状态。

时间复杂度仍为O(max(| N |,| E |)),您只需要为每个节点添加一个额外字段,指示该节点所在的组件。