我正在 Spoj 上做一个问题,基本上可以简化为检测图是否是二分图。 我正在尝试使用 dfs 为图表着色,但它太慢了。 有人评论这个
没有 bfs,没有 dfs,没有二部图。简单的并查集就可以做到(确实速度很快)。 提示#1: 偶数长度的环不会影响两个节点之间的路径长度被 2 整除(哇,一个字有这么多 i)。 提示#2: (剧透) 令 dist[i] 为从 i 到 Parent[i] 的路径距离。使用 find 和 union 函数更新它。可以改进为将 dist 设为 bool 数组。
有人能解释一下他的意思吗? 我认为他想说的是,对于每个节点,你存储节点和代表元素之间的距离。 然后,如果您尝试合并同一集中的两个节点,并且它们具有相同的奇偶校验,那么您将创建一个奇数循环,因此该图不能是二分图。 但是,我不明白这将如何实施。 如何在考虑距离的同时合并两组? 您是否必须查看整个集合才能找到所有要更新的元素?
给定一个表示为邻接列表(即边列表)的图,您可以确定它是否是二部的,如下所示:
DSU 不适合这种情况,因为如果我们采用集合并尝试在以下条件下将边映射到它们:
对于边 u,v 如果 Map[u]=NULL,Map[v]=NULL 我们无法确保一个随机分配给出最佳着色,因为有时选择所选情况不能为整个图着色,但另一种情况可以为它着色。所以我们需要检查两种情况为图表着色
几乎需要指数时间复杂度,比通常的 DFS 差得多。所以 DSU 并没有为这个问题提供更好的解决方案