使用联合查找(也称为不交集)检测图是否为二分图

时间:2018-11-11 06:40:49

标签: algorithm bipartite disjoint-sets

我在Spoj上遇到了一个问题,基本上可以简化为检测图是否为二分图。我正在尝试仅使用dfs为图形着色,但这太慢了。有人对此发表评论

  

无bfs,无dfs,无二部图。简单的联合查找集将使其(确实具有速度)。   提示1:   偶数长度的周期不会影响两个节点之间路径长度的2(哇,一个单词中有这么多i)。   提示2:   (扰流板)   令dist [i]为从i到parent [i]的路径的距离。使用find和union函数更新它。可以将dist设为bool数组。

有人可以解释他的意思吗?我认为他想说的是,对于每个节点,您都存储了节点与代表元素之间的距离。然后,如果您尝试合并同一集合中的两个节点,并且它们具有相同的奇偶校验,那么您将创建一个奇数周期,因此该图不能是二分图。但是,我不知道如何实现。在考虑距离的同时如何合并两个集合?您是否不必浏览整个集合以查找所有要更新的元素?

链接到问题:https://www.spoj.com/problems/BUGLIFE/

1 个答案:

答案 0 :(得分:2)

给定一个以邻接表(即边列表)表示的图,可以确定它是否是二分的,如下所示:

  • 初始化不相交集数据结构 SETS ,并为每个顶点设置一个单例集。 (如果两个顶点之间有一条平均长度的路径,那么除非最终返回return,否则我们最终将把这两个顶点统一为同一集合。)
  • 初始化每个顶点到ɴɪʟ的映射 MAP 。 (在检查边缘时,我们将在 MAP 中填充从每个顶点到其相邻顶点之一的映射。)
  • 对于每个边{ u v }:
    • 如果 u v 属于 SETS 中的同一集合,则返回ꜰᴀʟꜱᴇ。
    • 如果 MAP [ u ] =ɴɪʟ,则设置 MAP [ u ]:= v
      否则,更新 SETS 以将 v MAP [ u ]统一。
    • 如果 MAP [ v ] =ɴɪʟ,则设置 MAP [ v ]:= u
      否则,更新 SETS 以将 u MAP [ v ]统一。
  • 返回