1. 图的表示
邻接表、邻接矩阵
对于邻接表的表示,如果需要O(1)时间删除边,可以用一个单独的散列表来记录每条边的信息。
2. 图的路径和可达性
无向图的顶点可达性:可以使用并查集来完成,可支持动态添加边,O(1)查询。
或者一次BFS或DFS可以得到两个顶点是否可达。
有向图的顶点可达性:BFS或DFS
无向图的欧拉路径:环消除算法
无向图的割点和桥:
一个顶点u是割点,当且仅当满足(1)或(2)
(1) u为树根,且u有多于一个子树。
(2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得DFS(u)<=Low(v)。
一条无向边(u,v)是桥,当且仅当(u,v)为树枝边,且满足DFS(u)<Low(v)。
有向图的强连通分支:Kosaraju算法、Tarjan算法
无向图的环检测:DFS检测回边。O(V)(因为找到V条边之后就证明有环了)
有向图的环检测:DFS检测回边(包括父边)
有向图的奇数环:转换为2-染色问题
有向图的拓扑排序:DFS后序序列的逆序列
2. 最短路和最小生成树
有向图的传递闭包:Warshall算法O(n^3),多个顶点DFS O(VE)
单源最短路:Bellman Ford算法、Dijkstra算法(要求无负边)
全源最短路:Floyd算法O(n^3)、Dijkstra算法O(VElogV) 要求无负边、Johnson算法O(VElogV)
最小生成树:Prim算法、Kruscal算法
第二小生成树
3. 网络流
求最小割:求最大流之后,从源点开始在剩余图上bfs,遍历到的点集合是S,没有遍历到的点集是U,连接S-U的所有边就是最小割。
二部图最大匹配
边连通度、顶点连通度
运输问题、邮差问题、分配问题(最小成本流)
有上下界的可行流:先加边转化为循环流,再添加辅助顶点,见:
《一种简易的方法求解流量有上下界的网络中网络流问题》(周源)
航班调度(即有向图最小路径点覆盖):拆分成二部图,转换为类似二部图匹配问题
(《算法设计》7.9)
形似 ∑ai + ∑bj + ∑d(i, j) 的最小值可以转换为最小割问题求解。
A B <i, j> ∈E
项目选择问题(《算法设计7.11):一个图,每个顶点有一个权重wi(可以是负的),顶点i和j之间有一条边,表示如果选择i,就必须同时选择j。要选出一些顶点,使得权重之和最大。
增加两个顶点s和t,s和每个正权重的点连一条边,每个负权重的点连一条边,原图中的边赋以容量无穷大。求最小割,和s分到一组的点就是选出的顶点。
Baseball elimination问题(《算法设计》7.12):
剩余每场比赛设一个顶点uxy,每支球队(除了目标球队z以外)设一个顶点v,另外增加两个顶点s和t。
s -> uxy 容量 gxy
uxy -> vx 容量无穷
uxy -> vy 容量无穷
vx -> t 容量 m - wx
求出这个最大流对应的最小割,和s在同一个集合的顶点vx构成一个集合T,则最小割的值等于:
∑gxy + ∑(m - wx) = ∑gxy - ∑gxy + m|T| - ∑ wx
<x, y>不属于T x属于T <x,y>属于T x属于T
< ∑gxy
所以 ∑ wx + ∑gxy > m|T|
x属于T <x,y>属于T
(说明T集合中的球队得分平均值大于m)
邻接表、邻接矩阵
对于邻接表的表示,如果需要O(1)时间删除边,可以用一个单独的散列表来记录每条边的信息。
2. 图的路径和可达性
无向图的顶点可达性:可以使用并查集来完成,可支持动态添加边,O(1)查询。
或者一次BFS或DFS可以得到两个顶点是否可达。
有向图的顶点可达性:BFS或DFS
无向图的欧拉路径:环消除算法
无向图的割点和桥:
一个顶点u是割点,当且仅当满足(1)或(2)
(1) u为树根,且u有多于一个子树。
(2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得DFS(u)<=Low(v)。
一条无向边(u,v)是桥,当且仅当(u,v)为树枝边,且满足DFS(u)<Low(v)。
有向图的强连通分支:Kosaraju算法、Tarjan算法
无向图的环检测:DFS检测回边。O(V)(因为找到V条边之后就证明有环了)
有向图的环检测:DFS检测回边(包括父边)
有向图的奇数环:转换为2-染色问题
有向图的拓扑排序:DFS后序序列的逆序列
2. 最短路和最小生成树
有向图的传递闭包:Warshall算法O(n^3),多个顶点DFS O(VE)
单源最短路:Bellman Ford算法、Dijkstra算法(要求无负边)
全源最短路:Floyd算法O(n^3)、Dijkstra算法O(VElogV) 要求无负边、Johnson算法O(VElogV)
最小生成树:Prim算法、Kruscal算法
第二小生成树
3. 网络流
求最小割:求最大流之后,从源点开始在剩余图上bfs,遍历到的点集合是S,没有遍历到的点集是U,连接S-U的所有边就是最小割。
二部图最大匹配
边连通度、顶点连通度
运输问题、邮差问题、分配问题(最小成本流)
有上下界的可行流:先加边转化为循环流,再添加辅助顶点,见:
《一种简易的方法求解流量有上下界的网络中网络流问题》(周源)
航班调度(即有向图最小路径点覆盖):拆分成二部图,转换为类似二部图匹配问题
(《算法设计》7.9)
形似 ∑ai + ∑bj + ∑d(i, j) 的最小值可以转换为最小割问题求解。
A B <i, j> ∈E
项目选择问题(《算法设计7.11):一个图,每个顶点有一个权重wi(可以是负的),顶点i和j之间有一条边,表示如果选择i,就必须同时选择j。要选出一些顶点,使得权重之和最大。
增加两个顶点s和t,s和每个正权重的点连一条边,每个负权重的点连一条边,原图中的边赋以容量无穷大。求最小割,和s分到一组的点就是选出的顶点。
Baseball elimination问题(《算法设计》7.12):
剩余每场比赛设一个顶点uxy,每支球队(除了目标球队z以外)设一个顶点v,另外增加两个顶点s和t。
s -> uxy 容量 gxy
uxy -> vx 容量无穷
uxy -> vy 容量无穷
vx -> t 容量 m - wx
求出这个最大流对应的最小割,和s在同一个集合的顶点vx构成一个集合T,则最小割的值等于:
∑gxy + ∑(m - wx) = ∑gxy - ∑gxy + m|T| - ∑ wx
<x, y>不属于T x属于T <x,y>属于T x属于T
< ∑gxy
所以 ∑ wx + ∑gxy > m|T|
x属于T <x,y>属于T
(说明T集合中的球队得分平均值大于m)