6.6 图的应用

6.6.1 最小生成树

  • 生成树:所有顶点均由边连接在一起,但不存在回路的图

    • 一个图可以有许多棵不同的生成树

    • 所有生成树具有以下共同特点

      • 生成树的顶点个数与图的顶点个数相同
      • 生成树是图的极小连通子图,去掉一条边则非连通
      • 一个有n个顶点的连通图的生成树有n-1条边
      • 在生成树中再加一条边必然形成回路
      • 生成树中任意两个顶点间的路径是唯一
  • 无向图的生成树:

    • 设图G=(V,E)是个连通图,当从图任一顶点出发遍历图G时,将边集E(G)分成两个集合T(G) 和B(G)。其中 T(G)是遍历图时所经过的边的集合,B(G)是遍历图时未经过的边的集合。显然,G1(V,T)是图G的极小连通子图。即子图G1 是连通图G的生成树
  • 最小生成树

    • 给定一个无向网络,在该网络的所有生成树中,使得各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树

    • 最小生成树的典型用途

      • 要在n个城市间建立通信网,则n个城市应铺设n-1条路,每条路也有对应的经济成本
      • 建立数学模型:
        • 顶点 代表城市 有n个
        • 边 代表线路 有n-1条
        • 边的权值 表示线路的经济代价
        • 连通网 表示n个城市间的通信网
  • 构造最小生成树

    • 构造最小生成树的算法很多,其中多数算法都利用了MST的性质
    • MST性质:设N=(V,E) 是一个连通网,U是顶点集V的一个非空子集。若边(u,v) 是一条具有最小权值的边,其中$u\in U,v \in V-U$则必存在一棵包含边(u,v)的最小生成树
    • 在生成树的构造过程中,图中n个顶点分属两个集合:
      • 已落在生成树上的顶点集: U
      • 尚未落在生成树上的顶点集: V-U
    • 接下来则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边

6.6.1.1 普利姆(prim)算法
  • 算法思想:

    1. 设N=(V,E)是连通网,TE是N上最小生成树 中边的集合

    2. 初始令$U={u_0},(u_0 \in V),TE=${}

    3. 在所有$u\in U,v \in V-U$的边$(u,v)\in E$中找一条代价最小的边$(u_0,v_0)$.

    4. 将$(u_0,v_0)$并入集合TE,同时$v_o$并入U

    5. 重复上述操作直至U=V为止,则T=(V,TE)为N的最小生成树

6.6.1.2 克鲁斯卡尔(Kruskal)算法
  • 算法思想:
    1. 设连通网 N=(VE),令最小生成树初始状态为只有 n个顶点无边的非连通图T=(V,{}),每个顶点自成一个连通分量。
    2. 在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即:不能形成环),则将此边加入到 T中;否则,舍去此边,选取下一条代价最小的边。
    3. 依此类推,直至T中所有顶点都在同一连通分量上为止。
  • 最小生成树可能不唯一
算法名 普里姆算法 克鲁斯卡尔算法
算法思想 选择点 选择边
时间复杂度 O(n^2)(n为顶点数) O(eloge)(e为边数)
适应范围 稠密图 稀疏图

6.6.2 最短路径

  • 两种最常见的最短路径问题:
    1. 单源最短路径——用Dijkstra(迪杰斯特拉)算法
    2. 所有顶点间的最短路径——用Floyd——(弗洛伊德)算法
6.6.2.1 迪杰斯特拉算法
  1. 初始化:从源点$v_0$到各终点$v_k$的直达路径 $(v_o,v_k)$,即通过一条弧到达的路径。
  2. 选择:从这些路径中找出一条长度最短的路径$(v_0,u)$.
  3. 更新:然后对其余各条路径进行适当调整:
    1. 若在图中存在弧$(u,v_k)$,且$(v_0,u)+(u,v_k)<(v_0,v_k),则以路径(v_0,u,v_k)代替(v_0,v_k)$
  4. 在调整后的各条路径中,再找长度最短的路径,依此类推

时间复杂度为 $O(n^3)$

6.6.2.2 弗洛伊德算法

6.6.3 拓扑排序

  • 有向无环图:无环的有向图,简称DAG图

    • 有向无环图常用来描述一个工程或系统的进行过程。
    • 一个工程可以分为若干个子工程,只要完成了这些子工程,就可以导致整个工程的完成
  • AOV网 拓扑排序

    • 用一个有向图表示一个工程的各子工程及其相只制约的关系,其中以顶点表示活动弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称 AOV网(Activity On Vertex network)。
  • AOE网 关键路径

    • 有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称为AOE网 (Activity On Edge)
  • AOV网的特点:

    1. 若从i到j有一条有向路径,则i是j的前驱j是i的后继
    2. 若<i,j>是网中有向边,则i是j的直接前驱;j是i的直接后继
    3. AOV网中不允许有回路,因为如果有回路存在,则表明某项活动以自己为先决条件,显然这是荒谬的。
  • 拓扑排序

    • 在AOV 网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若 AOV 网中有弧 <i,j>存在,则在这个序列中,i一定排在的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序
  • 拓扑排序方法:

    1. 在有向图中选一个没有前驱的顶点且输出
    2. 在图中删除该顶点和所有以他为尾的弧
    3. 重复1和2直到全部顶点均已输出;当图中不存在无前驱的顶点位置
      • 一个AOV网的拓扑序列不是唯一的
  • 拓扑排序的一个重要应用:

    • 检测AOV网中是否存在环的方法:
      • 对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该 AOV 网必定不存在环。
  • 关键路径

  • 假设一个工程有11项活动,9个事件

    • 事件V1——表示整个工程开始(源点:入度为0的顶点)
    • 事件v9——表示整个工程结束(汇点:出度为0的顶点)

  • 关键路径——路径长度最长的路径
  • 路径长度——路径上各活动持续时间之和
    • ve(vj)——表示事件vj的最早发生时间
    • vl(vj)——表示事件vj的最迟发生时间
    • e(i)——表示活动ai的最早开始时间
    • l(i)——表示活动ai的最迟开始时间
    • l(i)-e(i)——表示完成活动ai的时间余量
    • 关键活动——关键路径上的活动,即l(i)==e(i)的活动(即没有时间余量的活动)

  • 其中√的为关键活动,而包含关键活动的路径为关键路径
    • 需要加快同时在几条关键路径上的关键活动
      • 如:a11,a10,a8,a7
    • 如果一个活动处于所有关键路径上,那么提高这个活动的速度,就能缩短整个工程的完成时间
      • 如:a1,a4
    • 处于所有关键路径上的活动完成时间不能缩短太多,否则会使原来的关键路径变成不是关键路径。这时必须重新寻找关键路径