数据结构--图的应用

一、最小生成树

(一)Kruskal算法

  1. 又称“加边法”。
  2. 开局最小生成树拥有所有图的所有结点,每次选择权重最小的边,且该边的两端要属于两棵不同的树。重复此操作,直到所有顶点都在一棵树内,或者有n-1条边为止。
  3. 不能构成回路。
  4. 边稀疏的图适合使用该算法。e条边的图,执行该算法时间复杂度为O({e}\log_{e})

例:

数据结构--图的应用_第1张图片

数据结构--图的应用_第2张图片

(二)Prim算法

  1. 又称“加点法”。
  2. 开局最小生成树为空,每次选择权重最小的边,且该边的两个端点,一个在树里,一个不在树里。(这个树最后就是最小生成树)
  3.  思路:在树里选一个点,然后寻找权重最小的边。
  4. 边稠密的图适合使用该算法。v个顶点的图,执行该算法时间复杂度为O(v^{2})

例:

数据结构--图的应用_第3张图片

数据结构--图的应用_第4张图片


二、最短路径

(一)Dijkstra算法--求单源最短路径

  1. s[ i ]:标记是否已经完成计算。
  2. dist[ i ]:记录当前源点到点 i 的最短路径 。
  3. path[ i ]: 源点到点 i 的最短路径中,点 i 的前一个结点坐标。
  4. 初始情况下,s[ i ] 全部为0;dist[ i ]是源点到点 i 的边的权值,若没有边,则记为∞;源点path[ 0 ] = -1,若点 i 与源点有边,则path[ i ] = 0;否则为-1。
  5. v个顶点的图,求单源最短路径的时间复杂度为O(v^{2});求每一个点到其他点的最短路径时间复杂度为O(v^{^{3}})
  6. 图中,边的权值不能为负值

例1:

数据结构--图的应用_第5张图片

数据结构--图的应用_第6张图片

每一轮找上一轮中,dist[ i ]最小 且 s[ i ]为0的点,将s[ i ]置为1,并尝试源点通过该点计算到达其他点的最短路径dist[ i ],如果比上一轮小,则更新dist[ i ]和path[ i ]

 例2:

数据结构--图的应用_第7张图片

 数据结构--图的应用_第8张图片

(二)Floyd算法--求多个点之间的路径

  1. n个点的图(结点序号0 ~ n-1),递推产生n阶方阵序列:A^{(-1)}, A^{(0)}, A^{(1)}......A^{(n-1)}。其中初始方阵A^{(-1)}是图的邻接矩阵,A^{(n-1)}存储最终结果。
  2. A^{(K)}意思是,加入结点v_{k},更新后的最短路径。
  3. ★★★★
  4. v个顶点的图,Floyd算法时间复杂度O(v^{3})

例:

数据结构--图的应用_第9张图片


三、AOV网与AOE网

(一)AOV网

基本介绍

  1. 有向无环图,边无权值。
  2. 顶点表示活动,边表示活动顺序。
  3. 经常对其进行拓扑排序。
  4. 拓扑排序:拿出没有前驱的点,直到图为空。

例一:

数据结构--图的应用_第10张图片

 数据结构--图的应用_第11张图片

例二:

 ( A + B ) * ( ( A + B ) / A ) 至少需要的顶点数为?

答:5个

(1)表达式转二叉树

数据结构--图的应用_第12张图片

(2)二叉树去重

数据结构--图的应用_第13张图片


(二)AOE网

基本介绍:

  1. 有向无环图,但是边有权值。
  2. 顶点表示事件,边表示活动。边的权值表示活动持续时间。
  3. 关键路径:从开始事件结束事件,花费最长时间的路径。即 从源点汇点边权值之和最大的路径。

AOE网的两个性质

  1. 顶点表示的事件发生后出边对应的活动才能发生。
  2. 进入顶点的所有入边的活动结束顶点表示的事件才能开始。

几个术语:

  1. 事件v_{k}最早发生时间源点 到 点v_{k}的 最长路径长度。
  2. 事件v_{k}的最迟发生时间V_{l}(k)从后向前算(见后面例子)
    1. 源点最早发生时间V_{e}(1) = 0
    2. 汇点最早发生时间 = 汇点最迟发生时间  即V_{e}(n) = V_{l}(n) 
  3. 活动a_{i}最早发生时间e_{i}  = 以它为出边顶点k的最早发生时间
  4. 活动a_{i}最迟发生时间l_{i} = 以它为入边顶点j的最迟发生时间V_{l}(j)  -  活动时间Weight(k,j)(即边的权值)。

关于入边、出边的说明:如图

数据结构--图的应用_第14张图片

 称 顶点k活动a_{i}对应的边 出边,  顶点j活动a_{i}对应的边 入边

求关键路径步骤:

  1. 从源点v_{1}出发,V_{e}(1) = 0,按拓扑排序,依次求出所有事件最早发生时间V_{e}(i)
  2. 出边活动的最早发生时间 (顶点的最早发生时间)e_{i} =V _{e}(k) 
  3. 从汇点v_{n}出发,V_{l}(n) = V_{e}(n),得到汇点最迟发生时间依次求出所有事件最早发生时间V_{l}(i)
  4. 入边活动的最迟发生时间 l_{i} = V_{l}(i) - weight(k,j)

例子:

数据结构--图的应用_第15张图片

数据结构--图的应用_第16张图片

数据结构--图的应用_第17张图片

数据结构--图的应用_第18张图片

数据结构--图的应用_第19张图片

 数据结构--图的应用_第20张图片

注意

  1. 加速关键活动可以缩短整个工程的工期
  2. 不能无限制的缩短,防止关键活动变成非关键活动
  3. 多个关键路径,只有加快包含在所有关键路径上的关键活动,才能缩短工期

你可能感兴趣的:(#,数据结构笔记,数据结构,图论)