22.5-1 如果在图G中加入一条新的边,G中的强连通分量的数量会发生怎样的变化?
ANSWER:减1或者不变。
22.5-2 给出算法STRONGLY-CONNECTED-COMPONENTS 在图22-6上的运行过程。具体要求是,给出算法第1行所计算出的完成时间和第3行所生成的森林。假定DFS的第5~7行的循环是以字母表顺序来对结点进行处理,并且连接链表中的结点也是以字母表顺序排列好的。
ANSWER:DFS(G)森林:(其中红色为树边)
强连通分量结果:
22.5-3 Bacon教授声称,如果在第二次深度优先搜索时使用原始图G而不是图G的转置图GT,并且以完成时间的递增次序来扫描结点,则计算强连通分量的算法将会更加简单。这个更加简单的算法总是能计算出正确的结果吗?
不总能计算出正确结果。如上图,应有三个不同的连通分量,但这个更简单的算法会将b、c看成同一个连通分量。
22.5-4 证明:对于任意有向图G来说,(SCC(GT))T = SCC(G),也就是说,转置图GT的分量图的转置和图G的分量图相同。
ANSWER:由于图G、GT的强连通分量是完全一样的,所以收缩后的分量图的结点也是一样。
假设存在x ∈ C,y ∈ C',C、C'为强连通分量,(x, y) ∈ E。则在SCC(G)中,C指向C'。且(y, x) ∈ ET,则在SCC(GT)中,C'指向C。
所以(SCC(GT))T = SCC(G)。
22.5-5 给出一个时间复杂度为O(V+E) 的算法来计算有向图 G = (V, E) 的分量图。请确保算法所生成的分量图中任意两个结点之间至多存在一条边。
ANSWER:
(1)利用STRONGLY-CONNECTED-COMPONENTS(G)将结点分类,给每个分量中的结点赋予一个相同的标号,时间为O(V+E)。
(2)将同属一个分量的结点在分量图中记录在一起。
(3)对每个分量中每个结点遍历,记录每个分量中的结点向其他分量发出的边,并在分量图中补上。时间复杂度为O(V+E),但需要O(V)空间来记录分量图的边以避免出现重合的边。
22.5-6 给定有向图G = (V, E),请说明如何创建另一个图G' = (V, E'),使得:(a)G'的强连通分量与G的相同,(b)G'的分量图与G的相同,以及(c)E'所包含的边尽可能少。请给出一个计算图G'的快速算法。
ANSWER:
(1)利用强连通分量算法区分出不同的分量,并将分量图计算出。
(2)对于每个分量,找出同一分量中的每个结点,然后用一个简单的环连通每个结点。根据分量图的边给不同连通分量之间增加一条边(在一连通分量中随意寻找某一结点连接另一连通分量中的随意一个结点)。
22.5-7 给定有向图G = (V, E),如果对于所有结点对u, v ∈ V,我们有u→v或v→u,则G是半连通的。请给出一个有效的算法来判断图G是否半连通的。证明算法的正确性并分析其运行时间。
ANSWER:先运行强连通分量算法,按照第二次DFS结点搜索顺序给连通分量按升序标号(1~k),并生成分量图SCC(G)。在分量图SCC(G)中,由于标号为 i+1 的连通分量不可能指向标号为 i 的连通分量,所以只需要从1~k按顺序检测是否存在(1, 2)、(2, 3) ... (k-1, k)的分量的边。若存在,则半连通;反之,则不是半连通。算法时间复杂度为O(V+E)。