基本概念
-
图是由顶点(vertex)和边(edge)的集合,每一条边就是一个点对(a, b),如果点对是有序的就是有向图。
-
图的表示
邻接表
邻接矩阵 -
连通性:如果在一个无向图中从每一个顶点到每个其他顶点都存在一条路径,则称该无向图是连通的。具有这种性质的有向图是强连通的,如果一个有向图不是强连通的,但是他的基础图,即去掉边的方向所形成的图,是连通的,则称该有向图是弱联通的,完全图是其每一对顶点间都存在一条边的图。
-
DAG(有向无圈图): 如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个有向无圈图(DAG, Directed Acyclic Graph)
-
出度:由一个顶点出发的边的总数
-
入度:指向一个顶点的边的总数
算法精解:DAG有向无环图
深度优先搜索 DFS
只要可能,就在图中尽量“深入”,深度优先搜索总是对最近才发现的结点v的出发边进行探索,直到该结点的所有出发边都被发现为止。一旦节点v的所有出发边都被发现,搜索则“回溯”到v的前驱结点,来搜索该前驱结点的出发边。
根据DFS所生成的深度优先森林,可以定义4种边的类型:
- 树边:为深度优先森林种某一棵树的边。如果结点v是因为算法对边(u, v)的探索而首先被发现,则边(u, v)是一条树边
- 后向边B:后向边(u, v)是将结点u连接到其所在深度优先树种一个祖先结点v的边。
- 前向边F:是将结点u连接到其在深度优先树中一个后代结点v的边(u, v);
- 横向边:除上述3种之外的边,可以连接同一棵深度优先树种同一深度的两个结点,也可以连接不同深度优先树种的两个结点。
应用
- 拓扑排序
有向无环图所有的节点按照DFS的完成时间降序排序,即可完成一个拓扑时序图
广度优先搜索 BFS
将已发现的结点和未发现的结点之间的边界,沿其广度方向向外扩展。也就是说,算法需要在发现所有距离源结点s为k的所有结点之后,才会发现距离源结点s为k+1的其他结点。