算法导论第22章:基本的图算法

目录

图的表示

特殊的图

图的遍历

拓扑排序(Topological Sort)

强连通分量(Strongly Connected Components)

欧拉回路(Eulerian Circuit)

题选


图的表示

1.邻接矩阵(Adjacency Matrix)

2.邻接链表(Adjacency List)

3.完善邻接链表(Implementing Adjacency List)

4.握手定理:无向图所有结点的度之和 = 边数 * 2

特殊的图

1.树(Tree)

2.有向无环图(Directed Acyclic Graph)

3.二分图(Bipartite Graph)

图的遍历

1.深度优先搜索

算法导论第22章:基本的图算法_第1张图片

2.广度优先搜索

算法导论第22章:基本的图算法_第2张图片

拓扑排序(Topological Sort)

输入:DAG图

输出:如果e(u, v),则u在v的前面(结果不唯一)

思路一: O(n² + m)

①找到一个入度为0的点,加入到答案,把它的前向边全部删除;

②重复这一过程。

思路二:Θ(n + m)

①预计算所有点的入度

②把入度为0的点加入队列

③对于每个在队列中的点的链表,减去对应点的入度,若入度为0,加入队列

④重复,直到队列空

加入队列的顺序即为拓扑序

思路三:Θ(n + m)

深度优先搜索,记录u.f为u结点邻接链表被扫描完之后的时间,按f从大到小排序即为拓扑序

只需证明:若e(u, v)则u在v前面。

e被探索时,v不可能为灰色,因为这意味这环;

若v为白色,v必为u的后代,u肯定后被处理完;

若v为黑色,v.f已经确定,必定小于u.f

强连通分量(Strongly Connected Components)

算法导论第22章:基本的图算法_第3张图片

Kosaraju’s Algorithm:Θ(V+E)

①DFS计算出所有结点的扫描链表完成时间f

②按f的逆序搜索树,合并组成森林即为SCC

欧拉回路(Eulerian Circuit)

无向图有欧拉回路:连通,且每个节点的度为偶数

无向图有欧拉路:连通,且拥有奇数度数的结点个数为0或2

哈密尔顿: Looks similar but very hard (still unsolved)!

题选

1.求s->t的简单路径条数:拓扑排序+DP

2.判断图是否存在环:DFS过程观察是否有后向边,至多V次左右

3.给定有向图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)。

你可能感兴趣的:(算法导论)