目录
强连通分量(Strongly Connected Components)
图的表示
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次左右