问题与解答

问题描述

计算AOE-网中关键路径的长度。

输入格式

输入数据第一行是一个正整数,表示图中的顶点个数n(顶点将分别按0,1,…,n-1进行编号),顶点数不超过100,其中0为源点,n-1为汇点。之后的n行每行都包含n个整数,为AOE-网的邻接矩阵,其中0表示两个顶点间无直接可达的弧,大于0的整数表示活动持续的时间。

输出格式

输出AOE-网中关键路径的长度,如果网中有环,则输出“NO”。

样例输入

9

0 6 4 5 0 0 0 0 0

0 0 0 0 1 0 0 0 0

0 0 0 0 1 0 0 0 0

0 0 0 0 0 2 0 0 0

0 0 0 0 0 0 9 7 0

0 0 0 0 0 0 0 4 0

0 0 0 0 0 0 0 0 2

0 0 0 0 0 0 0 0 4

0 0 0 0 0 0 0 0 0

样例输出

18

输出说明

如果网中有环,则示例输出如下:NO

  1. //求解关键路径长度
  2. //只需要求关键路径长度,不需要打印关键路径
  3. //所以只需要在TopoSort()上进行改进即可
  4. #include<stdio.h>
  5. #include<queue>
  6. #include<algorithm>
  7. using namespace std;
  8. #define MaxN 100 //最大顶点数
  9. int n; //顶点数
  10. int G[MaxN][MaxN]; //邻接矩阵保存图
  11. int InDegree[MaxN] = {0}, Ve[MaxN]; //入度矩阵
  12. //Ve数组:事件最早开始时间,初始化为0
  13. int TopoSort(); //拓扑排序
  14. int main(){
  15. int i,j,w;
  16. scanf("%d",&n);
  17. for(i = 0; i < n; i++){ //读入邻接矩阵
  18. for(j = 0; j < n; j++){
  19. scanf("%d",&w);
  20. G[i][j] = w;
  21. if(w) InDegree[j]++; //j顶点入度+1
  22. }
  23. }
  24. int Path_Length = TopoSort();
  25. if(Path_Length == -1) printf("No");
  26. else printf("%d", Path_Length);
  27. }
  28. int TopoSort(){ //改动后的拓扑排序,返回关键路径长度
  29. fill(Ve,Ve+n,0); //初始化Ve数组
  30. queue<int> q;
  31. int i,node;
  32. for(i = 0; i < n; i++){
  33. if(InDegree[i] == 0)
  34. q.push(i);
  35. }
  36. while(!q.empty()){
  37. int u = q.front();
  38. q.pop();
  39. for(i = 0; i < n; i++){
  40. if(G[u][i] != 0){
  41. InDegree[i]--;
  42. if(InDegree[i] == 0)
  43. q.push(i);
  44. //更新Ve数组:在原TopoSort()基础上添加的部分
  45. if(Ve[u] + G[u][i] > Ve[i])
  46. Ve[i] = Ve[u]+G[u][i];
  47. }
  48. }
  49. node++;
  50. }
  51. if(node !=n) return -1; //存在有向环,拓扑排序失败
  52. else return Ve[n-1]; //拓扑排序成功,返回关键路径长度
  53. }

题后反思

  1. 本题只需要求解关键路径的长度而不需要确定关键路径的具体节点,所以只需要建立Ve数组即可,不需要用逆拓扑排序建立Vl求e与l。
  2. 注意点:实现时默认存在源点与汇点,汇点为 n-1 号顶点(从0开始计)。
  3. 关键路径完整算法

<数据结构>XDOJ.322关键路径长度的更多相关文章

  1. <数据结构>关键路径

    目录 AOV网和AOE网 AOV网 AOE网 定义 与AOV网的转化 AOE网中着重解决的两个问题 1.最长路径问题 2.关键活动问题 总结 最长路径 无正环的图 有向无环图的最短路径 其他情况 关键 ...

  2. 数据结构Java实现03----单向链表的插入和删除

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  3. 优化关键渲染路径CRP

    什么是关键渲染路径? 从收到 HTML.CSS 和 JavaScript 字节到对其进行必需的处理,从而将它们转变成渲染的像素这一过程中有一些中间步骤 浏览器渲染页面前需要先构建 DOM 和 CSSO ...

  4. 数据结构Java实现02----单向链表的插入和删除

    文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定)            概念: 链式存储结构是基于指针实现的.我们把一个数据 ...

  5. hash_map的简洁实现

    hash_map的简洁实现   hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样.如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢? 我们知道hash_map最 ...

  6. 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

    始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...

  7. 基于u-boot源码的简单shell软件实现

    一.概述 1.shell概念 Shell(命令解析器),它用于接收用户输入的命令,进行解析,然后调用相应的应用程序,为使用者提供了使用软件的界面. shell是操作系统最外面的一层.shell管理你与 ...

  8. 编写优质嵌入式C程序

    前言:这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序.感觉是有一定的参考价值,所以拿出来分享,抛砖引玉. 转载请注明出处:http://bl ...

  9. Golang 的内存管理(上篇)

    Golang 的内存管理基于 tcmalloc,可以说起点挺高的.但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现.下面的源码分析基于 go1.8 ...

随机推荐

  1. 源码分析-Consumer

    消息消费概述 消息消费以组的模式开展,一个消费组内可以包含多个消费者,每一个消费者组可订阅多个主题,消费组之间有集群模式和广播模式两种消费模式. 集群模式,主题下的同一条消息只允许被其中一个消费者消费 ...

  2. Spring同一个类中的注解方法调用AOP失效问题总结

    public interface XxxService { // a -> b void a(); void b(); } @Slf4j public class XxxServiceImpl ...

  3. 转 GSON

    转 https://www.jianshu.com/p/75a50aa0cad1 GSON弥补了JSON的许多不足的地方,在实际应用中更加适用于Java开发.在这里,我们主要讲解的是利用GSON来操作 ...

  4. iOS调用系统电话、浏览器、地图、邮件等

    - (IBAction)openMaps { //打开地图 NSString*addressText = @"beijing"; //@"1Infinite Loop, ...

  5. Shell脚本定期清空大于1G的日志文件

    一个关于如何在指定文件大于1GB后,自动删除的问题. 批处理代码如下: #!/bin/bash # 当/var/log/syslog大于1GB时 # 自动将其备份,并清空 # 注意这里awk的使用 i ...

  6. fatal: unable to access 'https://github.com/xxxxx/xxxx.git/': Failed to connect to github.com port 443: Timed out

    今天使用git push的时候提示"fatal: unable to access 'https://github.com/xxxxx/xxxx.git/': Failed to conne ...

  7. 初步接触Linux命令

    目录 虚拟机快照 1.首先将已经运行的系统关机 2.找到快照 拍摄快照 3.找到克隆 下一步 有几个快照会显示几个 4.克隆完成后 要修改一下IP 不然无法同时运行两个虚拟机系统 系统介绍 1.pin ...

  8. Salesforce LWC学习(三十七) Promise解决progress-indicator的小问题

    本篇参考:https://developer.salesforce.com/docs/component-library/bundle/lightning-progress-indicator/exa ...

  9. Jenkins凭证管理

    目录 一.简介 二.管理凭证 三.常用凭证 保密文本 账号密码 保密文件 账号秘钥 四.优雅使用凭证 保密文本 账号密码 保密文件 五.凭证插件 集成HashiCorp Vault pipeline ...

  10. 试工具_ab

    目录 一.简介 二.例子 三.参数 一.简介 ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的. 1.ab每次只能测试一个URL,适合做重复压力测 ...