本文作者为: SylvanasSun.转载请务必将下面这段话置于文章开头处(保留超链接).
本文转发自SylvanasSun Blog,原文链接: https://sylvanassun.github.io/2017/07/23/2017-07-23-Graph_DirectedGraphs/
有向图的性质
有向图与无向图不同,它的边是单向的,每条边所连接的两个顶点都是一个有序对,它们的邻接性是单向的.
在有向图中,一条有向边由第一个顶点指出并指向第二个顶点,一个顶点的出度为由该顶点指出的边的总数;一个顶点的入度为指向该顶点的边的总数.

v->w表示一条由v指向w的边,在一幅有向图中,两个顶点的关系可能有以下四种(特殊图除外):
- 没有
边相连.
- 存在一条从
v到w的边:v->w.
- 存在一条从
w到v的边:w->v.
- 既存在
v->w,也存在w->v,也就是一条双向边.
当存在从v到w的有向路径时,称顶点w能够由顶点v达到.但在有向图中,由v能够到达w并不意味着由w也能到达v(但每个顶点都是能够到达它自己的).
有向图的实现
有向图的实现与无向图差不多,只不过在边的方向上有所不同.(本文中的所有完整代码可以在我的GitHub中查看)

|
|
可达性
对于”是否存在一条从集合中的任意顶点到达给定顶点v的有向路径?”等类似问题,可以使用深度优先搜索或广度优先搜索(与无向图的实现一致,只不过传入的图的类型不同),有向图生成的搜索轨迹甚至要比无向图还要简单.
对于可达性分析的一个典型应用就是内存管理系统.例如,JVM使用多点可达性分析的方法来判断一个对象是否可以进行回收: 所有对象组成一幅有向图,其中有多个Root顶点(它是由JVM自己决定的)作为起点,如果一个对象从Root顶点不可达,那么这个对象就可以进行回收了.
环
在与有向图相关的实际应用中,有向环特别的重要.我们需要知道一幅有向图中是否包含有向环.在任务调度问题或其他许多问题中会不允许存在有向环,所以对于环的检测是很重要的.
使用深度优先搜索解决这个问题并不困难,递归调用隐式使用的栈表示的正是”当前”正在遍历的有向路径,一旦找到了一条边v->w且w已经存在于栈中,就等于找到了一个环(栈表示的是一条由w到v的有向路径,而v->w正好补全了这个环).
|
|
拓扑排序
拓扑排序等价于计算优先级限制下的调度问题的,所谓优先级限制的调度问题即是在给定一组需要完成的任务与关于任务完成的先后次序的优先级限制,需要在满足限制条件的前提下来安排任务.
拓扑排序需要的是一幅有向无环图,如果这幅图中含有环,那么它肯定不是拓扑有序的(一个带有环的调度问题是无解的).
在学习拓扑排序之前,需要先知道顶点的排序.
顶点排序
使用深度优先搜索来记录顶点排序是一个很好的选择(正好只会访问每个顶点一次),我们借助一些数据结构来保存顶点排序的顺序:
- 前序: 在递归调用之前将
顶点加入队列.
- 后序: 在递归调用之后将
顶点加入队列.
- 逆后序: 在递归调用之后将
顶点压入栈.

|
|
拓扑排序的实现
所谓拓扑排序就是无环有向图的逆后序,现在已经知道了如何检测环与顶点排序,那么实现拓扑排序就很简单了.

|
|
强连通性
在一幅无向图中,如果有一条路径连接顶点v和w,则它们就是连通的(既可以从w到达v,也可以从v到达w).但在有向图中,如果从顶点v有一条有向路径到达w,则w是从v可达的,但从w到达v的路径可能存在也可能不存在.
强连通性就是两个顶点v和w是互相可达的.有向图中的强连通性具有以下性质:
- 自反性: 任意
顶点v和自己都是强连通性的(有向图中顶点都是自己可达的).
- 对称性: 如果
v和w是强连通的,那么w和v也是强连通的.
- 传递性: 如果
v和w是强连通的且w和x也是强连通的,那么v和x也是强连通的.
强连通性将所有顶点分为了一些等价类,每个等价类都是由相互为强连通的顶点的最大子集组成的.这些子集称为强连通分量,它的定义是基于顶点的,而非边.
一个含有V个顶点的有向图含有1 ~ V个强连通分量.一个强连通图只含有一个强连通分量,而一个有向无环图中则含有V个强连通分量.
Kosaraju算法
Kosaraju算法是用于枚举图中每个强连通分量内的所有顶点,它主要有以下步骤:
- 在给定一幅
有向图$G$中,取得它的反向图$G^R$.
- 利用
深度优先搜索得到$G^R$的逆后序排列.
- 按照上述逆后序的序列进行
深度优先搜索
- 同一个
深度优先搜索递归子程序中访问的所有顶点都在同一个强连通分量内.
|
|
传递闭包

在一幅有向图G中,传递闭包是由相同的一组顶点组成的另一幅有向图,在传递闭包中存在一条从v指向w的边且仅当在G中w是从v可达的.
由于有向图的性质,每个顶点对于自己都是可达的,所以传递闭包会含有V个自环.
通常将传递闭包表示为一个布尔值矩阵,其中v行w列的值为true代表当且仅当w是从v可达的.
传递闭包不适合于处理大型有向图,因为构造函数所需的空间与$V^2$成正比,所需的时间和$V(V+E)$成正比.
|
|