图的定义和术语
G= (V,E) 表示 :V 是顶点 (vertex) 集合 , E 是边 (edge) 的集合
完全图 (complete graph)
稀疏图 (sparse graph)
- 稀疏度(稀疏因子)
- 边条数小于完全图的5%
密集图 (dense graph)
无向图
边涉及顶点的偶对无序 , 实际上是双通,(v, w) ,顶点之间的连线是没有方向区分的,则称这样的边是无向边,简称边
有向图 (directed graph 或 digraph)
边涉及顶点的偶对是 有序 的
< v, w> 表示从v指向w的边(单行线),称这样的边是有向边,简称弧
标号图 (labeled graph)
带权图 (weighted graph)
无向完全图
在一个无向图中,设V是包含n个结点的集合,且对于任意两个不相同的顶点之间都有一条边将它们连接,则称该图为无向完全图。
结论:在一个含有n个顶点的无向完全图中,有n(n-1)/2条边。
有向完全图:
在一个有向图中,设V是包含n个结点的集合,且对任意两个不同结点之间都有方向相反的两条弧相连,则称该图为有向完全图。
结论:在一个含有n个顶点的有向完全图中,有n(n-1)条弧。
顶点的度 (degree)
与该顶点相关联的边的数目
- 入度 ( in degree )
- 出度 ( out degree )
在有向图中,将从该顶点出发的弧的数目称为该顶点的出度,用OD(v)表示;对应的,将以该顶点结束的弧的数目称为该顶点的入度,用ID(v)表示;有向图顶点的度为出度和入度之和:
D (v)=ID (v)+OD(v)。
结论:对于具有n个顶点、e条边的图,顶点
子图 (subgraph)
图G= ( V,E ),G’= ( V’,E’)中,若 V’≤V, E’≤E,并且 E’中的边所关联的顶点都在 V’ 中,则称图G’是图G的 子图
路径 (path)
从顶点Vp到顶点Vq的路径 :
顶点序列
(若对有向图,则使得
• 如果Vp到Vq之间的所 有顶点都不同,则称简单路径
• 路径长度 (length) :路径中的边数(如果带 权,则是所有边的权重和)
回路 (cycle,也称为环)
简单回路 (simple cycle)
- 无环图 (acyclic graph)
- 有向无环图 (directed acyclic graph,简写为DAG)
无向图中,如果两个结点之间有平行边,容易 让人误看作“环”
无向图路径长度大于等于 3
• 有向图两条边可以构成环,例如<V0,V1>和 <V1,V0> 构成环
有根图
一个有向图中,若存在一个顶点 V0, 从此顶点有路径可以到达图中其它所有顶点,则称此有向图为有根的图, V0 称作图的根
- 树、森林
连通图
对无向图 G= (V,E) 而言,如果从 V1 到 V2 有一 条路径 (从 V2 到 V1 也一定有一条路径) ,则称 V1 和V2 是连通的 (connected)
如果无向图中任意两个顶点之间都连通,则称为连通图
如果不是连通图,则图中的极大连通子图称为连通分量
图 2 中的无向图就是一个连通图,因为此图中任意两顶点之间都是连通的。
无向图连通分支(连通分量)
连通分量:无向图的极大连通子图
- 极大顶点数:再加1个顶点就不连通了
- 极大边数:包含子图中所有顶点相连的所有边
重点区分:极大连通子图 和 极小连通子图
- 极大连通子图是无向图的连通分量,极大要求该连通子图包含其所有的边。
- 极小连通子图是既要保持图连通,又要使得边数最少的子图。
上图的无向图有2个连通分量
有向图的强连通分量
有向图 G (V,E),如果两个顶点 vi ,vj 间 (vi<>vj ) 有一条 从 vi 到 vj 的有向路径,同时还有一条从 vj 到 vi 的有 向路径,则称两个顶点 强连通
强连通图:有向图中任意两顶点均强连通
如图 4 所示就是一个强连通图。
• 非强连通图有向图的极大强连通子图,称为 强连通分量 (strongly connected components)。
例2,有向图,有三个强连通分量(v2也是一个强连通分量)
注:如果认为是v1-v3-v4的环的话,虽然可以任意顶点都连通,但是边就没有含全了,这样也是不行的!
例3:有向图,有4个强连通分量
分析:这题和上一道题正好形成了对照,这里找环就可以,所以V2,V3,V4构成一个强连通分量,剩余的 v1, V5 ,V6每个自己构成一个连通分量,所以一共是4个强连通分量。
总结:在有向图中寻找强连通分量,首先尽量寻找环路,在环路上的所有结点同属一个连通分量。其次不属于任何一个强连通分量的孤立点自身是一个强连通分量。
下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达,{5},{6}也分别是两个强连通分量。
网络
带权的连通图
图的抽象数据类型
class
类型名称:图(Graph)
数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成。
操作集:对于任意图 G
Graph
思考
为何不允许一条边的起点与终点都是同一 个顶点?
是否存在多条起点与终点都相同的边?
算法原理:(Tarjan)
用双向遍历取交际的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或者Tarjan算法。
Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一颗子树。
搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以盘对栈顶到栈中的节点是否为一个强连通分量。