图的应用
LZC Lv4

最小生成树(MST)

权值之和最小的生成树称为最小生成树(Minimum-Spanning-Tree, MST)

一个连通图的生成树包含图的所有顶点,并且只含尽可能少的边。对于生成树而言,若减一条边,则使生成树变成非连通图;若加一条边,则会形成图的一条回路。
生成树不同,每棵树的权值之和也可能不同。

MST的性质

  1. 若图GG中存在权值相同的边,则GG的最小生成树可能不唯一,即最小生成树的树形不唯一。当图GG中的各边权值互不相等时,GG的最小生成树是唯一的;若无向连通图GG的边数等于顶点数-1,即GG本身是一棵树时,则MST为本身。
  2. MST树形不唯一,但权值之和总唯一,且最小
  3. MST的边数 = 顶点数 - 1

假设G=(V,E)G=(V,E)是一个带权连通无向图,UU是顶点集VV的一个非空子集。若(u,v)(u,v)是一条具有最小权值的边,其中uU,vVUu\in U,v\in V-U,则必存在一棵包含(u,v)(u,v)的最小生成树。

找到一条权值最小边(u,v)(u,v)并且加入TT后不会产生回路,显然这是贪心思想。

Prim算法和Kruskal算法都是基于贪心算法的。

Prim

Prim算法的时间复杂度为O(V2)O(|V|^2),不依赖于边数,因此它适合边稠密的图。

初始时从图中任取一顶点加入树T,此时树中只含一个顶点,之后选择一个与当前T中顶点集合距离最近的顶点,并将该顶点和相应的边加入T,每次操作后T中的顶点数和边数都增加1。如此反复,直至所有顶点都加入T。

步骤如下:

  1. 假设G=(V,E)G=(V,E)是连通图,其最小生成树T=(U,ET)T=(U,E_T)ETE_T是MST中边的集合。
  2. 初始化:向空树T=(U,ET)T=(U,E_T)中添加图G=(V,E)G=(V,E)中的任意一个顶点u0u_0,使U={u0},ET=U=\{u_0 \}, E_T = ∅
  3. 循环(重复直至U=VU=V):从图GG中选择满足{(u,v)uU,vVU}\{(u,v)|u\in U,v\in V-U \}且具有最小权值的边(u,v)(u,v),加入树TT,置U=U{v},ET=ET{(u,v)}U=U ∪ \{v \},E_T=E_T ∪\{(u,v) \}

Kruskal

Kruskal算法的时间复杂度为O(Elog2E)O(|E|\log_2|E|),不依赖于顶点数,因此它适合边稀疏而顶点较多的图

初始时为只有n个顶点而无边的非连通图T={V,{}}T=\{V,\{\} \},每个顶点自成一个连通分量。然后按照边的权值由小到大的顺序,不断的选取当前未被选取过且权值最小的边,若该边依附的顶点落在T中不同的连通分量(使用并查集判断这两个顶点是否同属一棵树),若不在则将此边加入T,否则舍弃。如此反复,直至T中所有顶点都在一个连通分量上。

步骤如下:

  1. 假设G=(V,E)G=(V,E)是连通图,其最小生成树T=(U,ET)T=(U,E_T)
  2. 初始化:U=V,ET=U=V,E_T= ∅。即每个顶点构成一棵独立的树,TT此时是一个仅含V|V|个顶点的森林。
  3. 循环(重复直至TT是一棵树):按GG的边的权值递增顺序依次从EETE-E_T中选择一条边,若此边加入后不构成回路,则加入,否则舍去,直至ETE_T中含有n1n-1条边。

最短路径

当图是带权图时,把从一个顶点v0v_0到图中其余任意一个顶点viv_i的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径长度最短的那条路径(可能不止一条)成为最短路径

最短路径的性质:两点之间的最短路径也包含了路径上其他顶点间的最短路径。

带权有向图的最短路径问题一般可分为两类

  1. 单源最短路径:求图中某一顶点到其他各个顶点的最短路径。Dijkstra、Bellman-Ford
  2. 多源最短路径:求图中任意两个顶点之间的最短路径。Floyd

Dijkstra

时间复杂度O(V2)O(|V|^2),边权非负。贪心策略。

初始时,把源点v0v_0放入SS,集合SS每并入一个新顶点viv_i,都要修改源点v0v_0到集合VSV-S中顶点当前的最短路径长度值。

image-20240729155157785.png

以A为源点的Dijkstra求解过程:

顶点 第1轮 第2轮 第3轮 第4轮
B 3
A-B
C 20
A-C
18
A-B-C
D 40
A-C-D
E 45
A-E
43
A-B-E
43
A-B-E
43
A-B-E
集合S {A,B} {A,B,C} {A,B,C,D} {A,B,C,D,E}

【图-最短路径-Dijkstra(迪杰斯特拉)算法】

Bellman-Ford

时间复杂度O(VE)O(|V||E|),边权可负。

Floyd

插点法。时间复杂度O(V3)O(|V|^3),边权可负。

Floyd利用DP的思想寻找给定的加权图中多源点之间最短路径的算法。


拓扑排序

有向无环图:若一个有向图不存在环,则成为有向无环图,简称DAG图(Directed Acyclic Graph)。

AOV 网 (Activity On Vertex Network):若用DAG图表示一个工程,其顶点表示活动,用有向边<Vi,Vj><V_i,V_j>表示活动ViV_i必须先于活动VjV_j进行的这样一种关系,则将这种有向图成为顶点表示活动的网络,简称AOV网。

拓扑排序:在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序:

  1. 每个顶点出现且只出现一次
  2. 若顶点A的序列中排在顶点B的前面,则在图中不存在从B到A的路径。

或定义为:拓扑排序时对DAG图的顶点的一种排序,它使得若存在一条从顶点A到顶点B的路径,则在排序中B出现在A的后面。

每个AOV网都有一个或多个拓扑排序。


关键路径

最耗时的路径

在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为边表示活动的网络,简称 AOE 网(Activity On Edge Network)
AOE网和AOV网都是DAG图,不同之处在于它们的边和顶点所代表的含义是不同的,AOE网中所有的边有权值;而AOV网中的边无权值,仅表示顶点之间的前后关系。