📜  使有向图强连通所需的最小边(1)

📅  最后修改于: 2023-12-03 14:49:36.764000             🧑  作者: Mango

使有向图强连通所需的最小边

在图论中,有向图强连通指每两个节点之间都存在有向路径。如果一个有向图不是强连通的,则可以通过添加若干条边来使其强连通。

本文将介绍两种算法来求解使有向图强连通所需的最小边。

Tarjan算法

Tarjan算法是以其发明者Robert Tarjan命名的,它是一种使用深度优先搜索(DFS)遍历图并计算强连通分量的算法。

Tarjan算法使用了一个栈来保存在遍历过程中已经访问过的节点,和一个变量$index$记录节点访问的顺序。具体步骤如下:

  1. 对于图中每一个未访问的节点,以该节点为起点调用DFS函数。
  2. 在遍历一个节点时,先将该节点的$index$和$lowlink$设为$index$,并将该节点加入栈中。
  3. 遍历该节点的全部后继节点,如果未访问,则以该节点为起点继续遍历;如果已经访问过,则将该节点的$lowlink$更新为该节点的$index$和后继节点的$lowlink$中最小的那个。
  4. 如果遍历完该节点的所有后继节点后仍然满足$lowlink=index$,则将栈中该节点及其之前的节点全部弹出,并加入同一个强连通分量中。

通过以上步骤遍历完图后,我们可以得到该图的所有强连通分量以及它们的状况。而对于存在多个强连通分量的有向图,我们可以将它缩成一个点,这样就得到了一张DAG图。根据DAG图可以很容易得到每个强连通分量之间需要添加的最小边数。

Kosaraju算法

Kosaraju算法是另一种求解有向图强连通分量的算法,它的核心思想是先将原图反转,然后按照DFS的顺序访问反转后的图。

具体步骤如下:

  1. 对于原图进行一次DFS,存储遍历顺序的倒序。
  2. 反转原图,得到一个反转后的图。
  3. 按照DFS的顺序访问反转后的图,如果一个节点已经被标记为已经访问过,则跳过;如果没有,则将该节点及其可达节点作为一个强连通分量输出。

根据以上步骤可以得到该图的所有强连通分量及它们的情况。同样地,可以使用缩点来求解每个强连通分量之间需要添加的最小边数。

总结

本文介绍了两种求解有向图强连通分量的算法——Tarjan算法和Kosaraju算法。这两种算法各有优缺点,具体使用哪种算法需要根据实际的情况来选择。

需要注意的是,本文只介绍了求解强连通分量所需的最小边数,具体的实现还需要结合实际情况进行分析。