这是很容易错过的重要一点!强连通分量 (SCC) 被定义为一个 最大 个顶点集合,使得集合中的任何两个顶点都可以相互到达。 “最大”在这里是一个相当无害的词,但它做了很多繁重的工作。
让我们深入了解我们如何定义 SCC 是什么,以及为什么给定图中的数字只能在我们添加边时减少或保持不变。我的 CLRS 副本将有向图 G = (V, E) 的强连通分量定义为“顶点 C ⊆ V 的最大集合,使得对于每一对顶点 u 和 v 在 C 中,我们有 u⇝v 和
v⇝u;也就是说,顶点 u 和 v 是可以相互访问的。”
这里有几个重要的词可能会被忽视。跳出来给我的是“最大”、“两者”和“可达”。让我们按照我介绍它们的相反顺序来看看这些。第一个是可达的,这与您的期望差不多:如果一个顶点之间有一些路径,则它们可以从另一个顶点到达——也就是说,如果我们可以从第一个顶点开始并继续跟随相邻的边直到我们到达第二个.下一个重要的词是“both” - u 不仅可以从 v 到达,而且 v 也可以从 u 到达时间>。我们可以开始理解为什么我们会关心两个顶点是否都可以相互到达。如果
v 可以从 u 到达,这意味着 u 可以也 到达 v 的所有节点 可以到达 - 如果反过来也是这样,那么 u 和 v 都可以到达 all 相同的节点。从某种意义上说,就它们可以到达的位置而言,将它们视为同一个节点是合理的——暂时忽略所有关于效率、重量或距离的想法。
现在让我们检查一下我们认为 SCC 为“最大”的这组顶点的概念。发布的第二张图没有有两个 SCC,但只有一个。为什么?因为您注意到的“节点形式”不是它自己的 SCC——它是由图中所有顶点组成的单个 SCC 的一部分。一组顶点是最大当且仅当我们不能在图中包含任何其他顶点而不会失去我们集合中的每个顶点都可以从我们集合中的每个其他顶点到达的属性 - 在某种意义上,我们想要在我们的集合中尽可能多的节点而不破坏它。您指出的“三角形形式”不是最大集合,因为我们可以将“节点形式”添加到该集合中,并且我们仍然能够从每个其他节点到达每个节点 - 事实上,因为我们只对最大集合感兴趣,我们必须添加它,否则我们会将那个节点留在桌子上。
那么我们怎么知道一个图中 SCC 的数量只有在我们添加一条边时才能保持不变或减少呢?我们可以证明这些是
可能通过示例。为了证明 SCC 的数量可以保持不变,请想象一组具有循环的节点。如果我们假设在这个循环中节点之间存在一些尚不存在的边,我们可以添加它,并且我们没有增加 SCC 的数量,因为我们没有“获得访问”任何我们无法访问的节点已经到达。为了表明这个数字可以减少,假设你有两个顶点,顶点 a 有一条指向顶点的边
b,因此我们目前有两个 SCC。如果我们从 b 到 a 添加一条有向边,那么我们现在只有一个 SCC,即集合 {a,
b}。
我们怎么知道 SCC 的数量不能增加?这是一个非常直观的论点 - 首先,请注意,由于图中的所有顶点都包含在某个 SCC 中,我们可以创建更多 SCC 的唯一方法是将一些现有的 SCC 拆分。但是,我们永远无法通过添加边来做到这一点 - 如果我们查看所有 u 和 v 的集合 C 使得 u⇝v 和 v⇝u,添加新边不会破坏 u 和 v对于我们集合中的任何 u 和 v,em> 仍然可以相互访问。不可能通过添加边来分解现有的 SCC。
1Cormen、Thomas H. 等人。算法导论。第三版,麻省理工学院出版社,2009 年。