大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

最小生成树

定义

  • 所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小
  • 最小生成树:构造连通网的最小代价生成树

Prim算法

  • 中心思想是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树
  • 假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。算法从U={u0},TE={}开始。重复执行下述操作:
  • 在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树
  • 主要针对稠密图(边数较多时)
  • 算法的时间复杂度为O(n^2)

Kruskal算法

  • 中心思想是以边为目标去构建,因为权值是在边上,直接去找最小权值得边来构建最小生成树,构建时要考虑是否形成了环路
  • 假设N=(V,{E})是连通网,则令最小生成树的初始状态为只有n个顶点而无边的非连通图T={V, {} },图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。以此类推,直至T中所有顶点都在同一连通分量上为止。
  • 主要针对稀疏图
  • 算法的时间复杂度为O(e log e)

最短路径

  • 对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最小的路径

Dijkstra算法

  • 是一个按路径长度递增的次序产生最短路径的算法
  • 不是一下子求出了源点到终点的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上, 求得更远顶点的最短路径
  • 用于解决从某个源点到其余各顶点的最短路径问题,算法复杂度为O(n^2)
  • 若要用于任一顶点到其余所有顶点的最短路径,复杂度为O(n^3)

Floyd算法

  • 定义两个数组D和P,其中D代表顶点到顶点的最短路径权值和的矩阵,P代表对应顶点的最小路径的前驱矩阵
  • D^0[v][w] = min{D^(-1)[v][w], D^(-1)[v][0] + D^(-1)[0][w]}
  • D0以D^(-1)为基础,D1以D0为基础……直至最后一个顶点Dn
  • 代码间接,时间复杂度为O(n^3)

拓扑排序

  • 主要是为了解决一个工程能否顺序进行的问题

AOV网

  • 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的有限关系,这样的有向图为顶点表示活动的网,我们称为AOV网

拓扑序列

  • 设G=(V, E)是一个具有n个顶点的有向图,V中的序列v1,v2,…vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前。则我们称这样的顶点序列为一个拓扑序列

拓扑排序算法

  • 基本思路是:从AOV网中选择一个入度为0的顶点输出,然后删去此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止
  • 顶点表结点结构:in(入度的数字),data,firstedge
  • 使用了栈结构(LIFO)
  • 将入度为0的顶点入栈的时间复杂为O(n),入度减1的操作共执行了e次,整个算法的复杂度为O(n+e)

关键路径

  • 主要为了解决工程完成需要的最短时间问题

AOE网

  • 在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,称之为AOE网
  • 把路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径称为关键路径,在关键路径上的活动称为关键活动

关键路径算法

  • 只需要找到所有活动的最早开始时间和最晚开始时间,并且比较它们,如果相等就意味着此活动是关键活动,活动间的路径为关键路径
  • 时间复杂度为O(n+e)
发布了59 篇原创文章 · 获赞 3 · 访问量 1798

猜你喜欢

转载自blog.csdn.net/Felix_hyfy/article/details/99346344