第五周主要讲授了 "第3章:图的分解"的有向图强连通分量,以及“第4章:图的路径”中BFS算法。
讲授内容
1. 强连通分量(SSC-Strong Connectivity Component):SSC的主要算法,是建立在深度优先搜索(DFS)和 有向无环图(DAG)的概念之上。教材P105的两个性质,其中“性质:在有向无环图中,每条边都指向一个post值更小的顶点”,换句话就是,“源点的post值最大”,因为源点指向其他顶点;“性质:每个有向无环图至少含有一个源点和一个汇点”,那么就很自然的引申出了 强连通分量 的发现算法。
有向图G的超图是一个有向无环图,其反向图Gr也是一个有向无环图,其中G的源点成了Gr的汇点,G的汇点成了Gr的源点。所以,我们可以利用Gr,在深度优先搜索过程中,找到post最大的顶点,并且对顶点按照post值进行逆序(假设其顶点逆序为:GIJLKH D CF BE A,其中共有5个强连通分量)。则在原图G中,就是依次在汇点强连通分量中的顶点(顶点G)出发,进行深度优先遍历,从而不断的找到第一个汇点强连通分量(GHKLJI),标记好已经搜索的顶点;然后继续从顶点D开始搜索,得到第二个强连通分量D;……核心:深度优先搜索中顶点的搜索顺序至关重要。
2. (重点)有向图G(V,E)的强连通分量发现算法:(a)生成G的反向图Gr;(b)对反向图Gr进行DFS搜索,得到顶点post的逆序数组;(c)按照顶点post的逆序,在原图中进行深度优先遍历。
3. 广度优先搜索(BFS-Breadth First Search):特别适合用邻接表来表示图,与BFS搜索的顺序配合完美。算法中最核心的部分就是使用队列(Queue),利用其先进先出(FIFO)的性质,算法伪代码在教材P121.