chapter 6-4图的应用

相关算法的实现

Prim,Kruskal,Dijkstra,Floyd

相关算法要点

  1. Prim和Kruskal属于最小生成树算法;Dijkstra属于单源最短路算法;Floyld属于各顶点间最短路算法
  2. Prim适用于边稠密图,因为其时间复杂度与边无关,算法实现只遍历点。时间复杂度为O(v^2)
  3. Kruskal适用于边稀疏而点较多的图,因为其算法实现主要靠遍历边;边一般按从小到大用堆存放,因此取边复杂度为O(logE),此外遍历每条边并使用并查集评估,总的时间复杂度O(ElogE).
  4. Dijkstra时间复杂度为O(v^2),且不适用与边权有负值的图。Prim算法解决的问题是连通无向有权图中最小生成树问题,而Dijkstra算法解决的问题是源点到目标点的最短路径问题。虽然这两个算法在添加新结点时,都是选择“距离最短”的结点加入集合,但是Prim算法中,“距离最短”是指未访问的结点到已经访问的所有结点距离最小,即将已经访问的结点视为一个整体,将距离最小的结点加入到已访问的集合中;而在Dijkstra算法中,“距离最短”是指所有未访问结点(通过已访问的结点)到源点距离最小。
    且注意,Dijkstra在有向图上同样适用,且无法检测出连通图的环路,环路不会对算法造成影响。
  5. Floyd允许带负值的边权,但是不允许有带负值的回路,因为这样,回路中两点的最短距离可以无限小下去(绕圈).其时间复杂度为O(v^3).

有向无环DAG图

即有向图且没有环路,一般用于表示含公共子式的表达式。一般先构建表达式的二叉树,再将公共子式合并获得DAG。
在这里插入图片描述

AOV网和拓扑排序

  • AOV网指用DAG图表示一个工程,且顶点表示活动,有向边表示活动的先后顺序。
  • 拓扑排序指将AOV网中的事件组成一个序列,且该序列不唯一,因为AOV网中有许多并列的事件(发生的先后顺序无所谓),其排序算法见P232.
  • 注意若排序过程中,AOV网内还有顶点,但无入度为0的点,说明该网内有环路。若该AOV网无环路,则排序结束网为空
  • 由于拓扑排序除了遍历点,还要删除所有边,则时间复杂度O(v+e)
  • 逆拓扑排序:拓扑排序反过程。即从AOV网结尾开始,找出度为0的点,摘除该点并删去以其为终点的所有有向边。反复直至排序结束。或者用DFS进行:
    在这里插入图片描述
    注意DFS在使用递归栈进行遍历时,在顶点退栈前输出,输出的序列即为逆拓扑序列。

关键路径与AOE网

  • AOE网:与AOV网不同,其顶点表示事件,边表示活动,边权表示该活动的消耗时间。作为有向图,只有在某顶点前的所有边表示的活动完成,该顶点所代表的事件才会发生;而只有在某顶点代表的事件发生后,该顶点后的边代表的活动才能开始。
  • AOE同AOV,为有向无环图,且其顶点所表示的某些事件为并行,发生的先后顺序无所谓。
  • AOE网只有一个起点和一个终点,称为源点和汇点。
  • 关键路径:从源点到汇点的最大长度路径,其中的边代表的活动称为关键活动。
  • 一些时间衡量见P234
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值