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

版权声明: https://blog.csdn.net/leelitian3/article/details/82023594

目录

图的表示

特殊的图

图的遍历

拓扑排序(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.深度优先搜索

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)

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次左右

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/82023594