【问题标题】:Detect if a graph is bipartite using union find (aka disjoint sets)使用联合查找(又名不相交集)检测图是否为二分图
【发布时间】:2018-11-11 06:40:49
【问题描述】:

我在 Spoj 上做一个问题,基本上可以简化为检测一个图是否是二分图。我正在尝试使用 dfs 为图形着色,但它太慢了。有些人会这样做

没有 bfs,没有 dfs,没有二方图。简单的 Union-Find Set 会成功(确实是速度)。 提示 #1: 偶数长度的循环不会影响两个节点之间的路径长度被 2 整除(哇,一个词中有这么多 i)。 提示 #2: (剧透) 令 dist[i] 为从 i 到 parent[i] 的路径的距离。使用 find 和 union 函数更新它。可以改进使 dist 成为 bool 数组。

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

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

【问题讨论】:

  • @user3386109 是的,但是我将如何使用不相交集 数据结构 来执行此操作(我不是尝试使用不相交集来查找仅连接的两个集合彼此)。

标签: algorithm bipartite disjoint-sets


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多