我们可以使用 Union-Find 数据结构检测有向图中的循环吗?

Can we detect cycles in directed graph using Union-Find data structure?

我知道可以使用 DFS 和 BFS 检测有向图中的环。我想知道我们是否可以使用 Union-Find 检测有向图中的循环?

不,我们不能使用 union-find 来检测有向图中的循环。这是因为有向图不能使用不相交集(执行联合查找的数据结构)来表示。

当我们说'a union b'时,我们无法确定边缘的方向

  1. a 要去 b 吗? (或)
  2. b会去a吗?

但是,在无序图的情况下,每个连通分量相当于一个集合。所以union-find可以用来检测环路。每当您尝试对属于同一连通分量的两个顶点执行并集时,我们都可以说循环存在。

没有

举个例子:

  • Q1。取一张无向图:

上面的无向图中有环吗?是的。我们可以使用 Union-Find 算法找到循环。

  • Q2。现在看类似的有向图:

上面的有向图中有环吗?不! 但是如果你使用 Union-Find 算法来检测上面有向图中的循环,它会说是!由于 union-find 算法查看上图如下:

上图有循环吗?是的!但是原来的(Q2)问题被篡改了,这不是被问到的。所以 Union-find 算法会给出有向图的错误结果。

No, we cannot use union-find to detect cycles in a directed graph. This is because a directed graph cannot be represented using the disjoint-set(the data structure on which union-find is performed).

When we say 'a union b' we cannot make out the direction of edge

is a going to b? (or) is b going to a? But, incase of unordered graphs, each connected component is equivalent to a set. So union-find can be used to detect a cycle. Whenever you try to perform union on two vertices belonging to the same connected component, we can say that cycle exists.

只是想补充一下@Cherubim 的回答,我只是想到了这个问题,为什么我们不能弄清楚 'a union b' 的方向,就像我们可以认为它是连接到 b 一样('a union b' 只有 a->b) 的节点?

那也会失败,考虑两个节点 x 和 y,它们连接 x -> y 并且它们在不相交的集合中已经有父节点,x_root 和 y_root。 那么当我们说 'x union y'(x 连接到 y)时会发生什么,我们使 y_root 成为 x_root 的父级。这告诉我们:

  1. x_root -> y_root(也可以相反)
  2. x_root 和 y_root 相连。 (他们可能会断开连接)

因此,除了方向不明确之外,主要问题还在于并非有向图中的每个节点都相互连接。