当前位置: 首页 > news >正文

加权有向图问题2----多源最短路径问题(Floyd算法)和关键路径算法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Floyd算法

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。

Floyd算法能够处理带负权重的边的有向图但不能包含负权重环。

算法思想:

从起始顶点开始,依次加入一个顶点,每加入一个顶点,更新一下各条最短路径长度。各条最短路径长度保存在一个二位数组中。

算法实现:

for (int i = 0; i < V; i++) {
    for (int v = 0; v < V; v++) {
        if (edgeTo[v][i] == null) continue;  // 优化
        for (int w = 0; w < V; w++) {
            if (distTo[v][w] > distTo[v][i] + distTo[i][w]) {
                distTo[v][w] = distTo[v][i] + distTo[i][w];
                edgeTo[v][w] = edgeTo[i][w];
            }
        }
        // 检查负循环
        if (distTo[v][v] < 0.0) {
            hasNegativeCycle = true;
            return;
        }
    }
}

关键路径算法

优先级限制下的并行任务调度:给定一组需要完成的任务和每个任务所需要的时间,以及一组关于任务完成的先后次序的优先级限制。在满足条件的前提下应该如何在若干相同的处理器上安排任务并在最短的时间内完成任务?

“关键路径”算法可以在线性时间内解决此问题。这个问题与无环加权有向图的最长路径问题是等价的。

为了设计求关键路径的动态规划算法,现在定义三个术语

事件i可能最早发生的时间earliest(i): 是指从开始结点s到结点i的最长路径的长度。

事件i允许的最迟发生时间latest(i): 是值不影响效益的条件下,事件i允许发生的最晚时间。

关键活动: 处于关键路径上的活动是关键活动,它必须准时启动,否则就会使任务延期。

算法实现:

earliest()计算方法:

  • earlist(0) = 0
  • earlist(j) = max{earlist(i) + w(i,j)}    0<j<V, i∈P(j)   注:P(j)是拓扑图中与顶点j直接相邻的前一顶点集

latest()计算方法:

  • latest(V-1) = earliest(V-1)
  • latest(i) = min{latest(j) - w(i,j)}   0<=i<V-1,j∈S(i)    注:S(i)是拓扑图中与i直接相邻的后一结点集

关键活动计算方法:

若latest(j) - earliest(i) = e.weight (e为顶点i和j之间的有权边),则边e是关键活动。对于关键路径上的每一个关键结点i,都有latest(i) = ealiest(i).

算法步骤:

  1. 确认有向图G是无环图,并进行拓扑排序;
  2. 按拓扑次序计算earliest(i), 0<=i< V-1;
  3. 按逆拓扑排序计算latest(i), 0<=i< V-1;
  4. 计算latest(j) - earliest(i),判断是否为关键活动。

 

转载于:https://my.oschina.net/HuoQibin/blog/1594182

相关文章:

  • 021——VUE中变异方法 push/unshift pop/shift
  • P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)
  • 泛型的继承和通配符,同时归纳集合部分的面试点
  • VS 之 InstallShield Limited Edition for Visual Studio 2015 图文教程
  • utf
  • shell 并发进程的例子
  • 新手练练----也做即时通信系统(1)
  • 2017双11技术揭秘—分布式缓存服务Tair的热点数据散列机制
  • 8.不绑定(ngNonBindable)
  • spring boot 2.0之使用spring boot
  • ELK实战之Tomcat的json日志收集
  • 爬虫如何解决验证码的问题
  • PostgreSQL 时序数据案例 - 时间流逝, 自动压缩, 同比\环比
  • 使用 HttpClient 4 进行文件上传
  • 深入解析Spring Cloud内置的Zuul过滤器
  • 【Linux系统编程】快速查找errno错误码信息
  • CentOS7 安装JDK
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • iOS小技巧之UIImagePickerController实现头像选择
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • maya建模与骨骼动画快速实现人工鱼
  • mysql 5.6 原生Online DDL解析
  • Node 版本管理
  • rabbitmq延迟消息示例
  • Service Worker
  • SQLServer插入数据
  • tensorflow学习笔记3——MNIST应用篇
  • 不上全站https的网站你们就等着被恶心死吧
  • 缓存与缓冲
  • 模型微调
  • 浅谈Golang中select的用法
  • 在Unity中实现一个简单的消息管理器
  • - 转 Ext2.0 form使用实例
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​2020 年大前端技术趋势解读
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $NOIp2018$劝退记
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (pojstep1.3.1)1017(构造法模拟)
  • (二)linux使用docker容器运行mysql
  • (九)One-Wire总线-DS18B20
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (五)c52学习之旅-静态数码管
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)linux下的时间函数使用
  • (转)编辑寄语:因为爱心,所以美丽
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • ./configure、make、make install 命令
  • .net对接阿里云CSB服务
  • .NET多线程执行函数
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET企业级应用架构设计系列之应用服务器