<数据结构>XDOJ.322关键路径长度
问题与解答
问题描述
计算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
//求解关键路径长度
//只需要求关键路径长度,不需要打印关键路径
//所以只需要在TopoSort()上进行改进即可
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
#define MaxN 100 //最大顶点数
int n; //顶点数
int G[MaxN][MaxN]; //邻接矩阵保存图
int InDegree[MaxN] = {0}, Ve[MaxN]; //入度矩阵
//Ve数组:事件最早开始时间,初始化为0
int TopoSort(); //拓扑排序
int main(){
int i,j,w;
scanf("%d",&n);
for(i = 0; i < n; i++){ //读入邻接矩阵
for(j = 0; j < n; j++){
scanf("%d",&w);
G[i][j] = w;
if(w) InDegree[j]++; //j顶点入度+1
}
}
int Path_Length = TopoSort();
if(Path_Length == -1) printf("No");
else printf("%d", Path_Length);
}
int TopoSort(){ //改动后的拓扑排序,返回关键路径长度
fill(Ve,Ve+n,0); //初始化Ve数组
queue<int> q;
int i,node;
for(i = 0; i < n; i++){
if(InDegree[i] == 0)
q.push(i);
}
while(!q.empty()){
int u = q.front();
q.pop();
for(i = 0; i < n; i++){
if(G[u][i] != 0){
InDegree[i]--;
if(InDegree[i] == 0)
q.push(i);
//更新Ve数组:在原TopoSort()基础上添加的部分
if(Ve[u] + G[u][i] > Ve[i])
Ve[i] = Ve[u]+G[u][i];
}
}
node++;
}
if(node !=n) return -1; //存在有向环,拓扑排序失败
else return Ve[n-1]; //拓扑排序成功,返回关键路径长度
}
题后反思
- 本题只需要求解关键路径的长度而不需要确定关键路径的具体节点,所以只需要建立Ve数组即可,不需要用逆拓扑排序建立Vl求e与l。
- 注意点:实现时默认存在源点与汇点,汇点为 n-1 号顶点(从0开始计)。
- 关键路径完整算法
<数据结构>XDOJ.322关键路径长度的更多相关文章
- <数据结构>关键路径
目录 AOV网和AOE网 AOV网 AOE网 定义 与AOV网的转化 AOE网中着重解决的两个问题 1.最长路径问题 2.关键活动问题 总结 最长路径 无正环的图 有向无环图的最短路径 其他情况 关键 ...
- 数据结构Java实现03----单向链表的插入和删除
文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定) 概念: 链式存储结构是基于指针实现的.我们把一个数据 ...
- 优化关键渲染路径CRP
什么是关键渲染路径? 从收到 HTML.CSS 和 JavaScript 字节到对其进行必需的处理,从而将它们转变成渲染的像素这一过程中有一些中间步骤 浏览器渲染页面前需要先构建 DOM 和 CSSO ...
- 数据结构Java实现02----单向链表的插入和删除
文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构: (物理存储结构上不连续,逻辑上连续:大小不固定) 概念: 链式存储结构是基于指针实现的.我们把一个数据 ...
- hash_map的简洁实现
hash_map的简洁实现 hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样.如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢? 我们知道hash_map最 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- 基于u-boot源码的简单shell软件实现
一.概述 1.shell概念 Shell(命令解析器),它用于接收用户输入的命令,进行解析,然后调用相应的应用程序,为使用者提供了使用软件的界面. shell是操作系统最外面的一层.shell管理你与 ...
- 编写优质嵌入式C程序
前言:这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序.感觉是有一定的参考价值,所以拿出来分享,抛砖引玉. 转载请注明出处:http://bl ...
- Golang 的内存管理(上篇)
Golang 的内存管理基于 tcmalloc,可以说起点挺高的.但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现.下面的源码分析基于 go1.8 ...
随机推荐
- ssh : connect to host XXX.XXX.XXX.XXX port : 22 connect refused
初学者 写博客 如有不对之处请多多指教 我是要在俩个主机的俩个虚拟机上 用scp (security copy)进行文件远程复制. 但是 终端 提示 ssh : connect to host XXX ...
- 【leetcode】378. Kth Smallest Element in a Sorted Matrix(TOP k 问题)
Given an n x n matrix where each of the rows and columns is sorted in ascending order, return the kt ...
- ORACEL 创建DIRECTORY
oracle要直接对文件进行读写必须先创建一个DIRECTORY. 语法如下: CREATE DIRECTORY UTL_FILE_DIR AS '/home/oracle/oradir'; 可以通过 ...
- Local Classes in C++
A class declared inside a function becomes local to that function and is called Local Class in C++. ...
- NSString类里有个hash
实际编程总会涉及到比较两个字符串的内容,一般会用 [string1 isEqualsToString:string2] 来比较两个字符串是否一致.对于字符串的isEqualsToString方法,需要 ...
- jmeter设置参数化
设置参数化方法有3种 第一种: 1.打开 jmeter,导入badboy录制的脚本 导入后记得选择"step"右键选择change controller ->逻辑控制器-&g ...
- Linux:$i 和 ${i}区别
例如你要把有个变量的值和其他字符串连接起来,就需要用到{},以明示{}中的是一个变量. 例如: export var1=ABC export var2=var1=${var1} echo $var2 ...
- springmvc中的异常处理方法
//1.自定义异常处理类 2.编写异常处理器 3.配置异常处理器 package com.hope.exception;/** * 异常处理类 * @author newcityma ...
- eclipse.ini顺序
-vmargs需放在-Dfile.encoding=UTF-8之前,否则会出现乱码 举例: -startup plugins/org.eclipse.equinox.launcher_1.3.0.v2 ...
- HashMap、ConcurrentHashMap对比
1.hashmap的put的原理,hashmap的扩容及计算槽的算法,线程安全的hashtable.ConcurrentHashMap的区别是什么 1.1 hashMap的put原理 什么时候变成红黑 ...