图的算法:

本文介绍了Prim算法和Kruskal算法构建最小生成树的方法,探讨了最短路径处理中的Dijkstra算法和Floyd算法,以及拓扑排序和逆拓扑排序在有向无环图的应用,重点讲解了AOE网中的关键路径分析。
摘要由CSDN通过智能技术生成

最小生成树算法:

Prim算法:从某一个顶点开始构建生成树;每次讲代价最小的新顶点纳入生成树,知道所有顶点度纳入为止

Kruskal算法:每次选择一条权值最小的边,使这条边的俩头联通(原本联通的不选)知道所有结点都连通

比较适用场景:

最短路径处理:

BFS求无权图的单源最短路径:对于广度优先算法是新增了最短路径长度 d[]和 path[]前驱结点

BFS算法局限性:不适用带权值路径长度(适用权值相等或无边)

Dijkstra最短路径算法:

初始化:

final[]标记各顶点是否已找到最短路径:V0初始化为 true其他结点为 false

dist[]最短路径长度:当前结点到各个节点的最短路径(不相邻的设为无穷大)

path[]路径上的前驱:每个顶点在最短路径上的直接前驱(目前找到最好的路径结点)

第一轮:循环遍历所有结点,找到还没确定最短路径,即 dist最小的顶点Vi,令 final[i]=true

检测所有邻结自 Vi的顶点,若其 final的值为 false,则更新 dist和 path的信息(邻结点未找到最短路径的节点,根据此节点的权值加上至起始节点 V0的权值总和是否少于 dist[]记录最短路径的值,则更新 dist的值和 path至此结点的前驱结点)

第二轮:中间继续循环遍历所有结点,找到还没确定最短路径,且 dist最小的顶点 Vi,使 final[i] = ture

Dijkstra时间复杂度:

Dijkstra算法局限:不适用于负权值的带权图(Dijkstra算法无法处理带有负权值的边的图。这是因为如果存在负权边,就有可能出现路径更新的环路,导致算法无法正确求解最短路径)

Floyd算法:计算每一对顶点之间的最短路径

Floyd算法核心代码:

Floyd算法用于负权图:

Floyd算法的局限是:有不能处理带负权回路的图

有向无环图:

DAG描述表达式:

解题方式:(有向无环图存储结果不唯一)

Step:把各个操作数不重复的排成一排(后续合并的时候只有同层的才能合并)

Step:标出各个运算符的生效顺序(先后顺序有点出入无所谓)

Step:按顺序加入运算符,注意分层

Step:从底层向上逐层检测同层的运算符是否可以合体

拓扑排序:

AOV网:一定是有向无环图

拓扑排序实现:

Step:从  AOV网中选择一个没有前驱(入度为 0)的顶点并输出(如果原图存在环则会有 入度大于0情况)

Step:从网中删除该顶点和所有以他为起点的有向边

Step:重复 1,2直至当前的 AOV网为空或当前网中不存在无前驱的顶点为止

对有回路的图进行拓扑排序:

逆拓扑排序:

逆拓扑排序的实现:

总结:

AOE网:

有 AOE网中仅有一个度为 0的顶点,称为开始定点

且仅有一个出度为 0的结束顶点

关键路径:从原点至汇点的所有路径中,具有最大路径长度的称关键路径,其上的活动称关键活动

时间余量为 0的活动为关键活动

所有时间的最早发生事件:

各事件的最迟发生时间:后继结点的最迟发生时间减事假间去边的权值时间

计算所有时间的最早发生时间:

计算所有活动的最早发生时间: e(i)=ve(k)前驱结点最小的时间结点

所有活动的最迟发生时间:这个结点的前驱结点减去这俩个事件的权值

总结:

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值