求关键路径,只需理解顶点(事件)和边(活动)各自的两个特征属性以及求法即可:

   Ø  先根据首结点的Ve(j)=0由前向后(正拓扑序列)计算各顶点的最早发生时间

   Ø  再根据终结点的Vl(j)等于它的Ve(j)由后向前(逆序拓扑)依次求解各顶点的最晚发生时间

   Ø  根据边的ee(i)等于它的发出顶点的Ve(j)计算各边的最早开始时间(最早开始,对应最早发生)

   Ø  根据边的ll(i)等于它的到达顶点的Vl(j)减去边的权值计算各边的最晚开始时间(最晚开始,对应最晚发生)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<stack>
#define MAX_NODE_NUM 100
using namespace std; int first[MAX_NODE_NUM];
typedef struct EDGE{
int u, v, w;
int nextarc;
EDGE(){
}
EDGE(int u, int v, int w, int nextarc){
this->u = u;
this->v = v;
this->w = w;
this->nextarc = nextarc;
}
} edge; vector<edge> g;
stack<int> s, t;//s存储入度为零的节点, t存储图的拓扑序列的顶点栈 int ve[MAX_NODE_NUM];//事件的最早发生时间, 或者 活动ai的最早发生时间
int vl[MAX_NODE_NUM];//事件的最晚发生时间
int degIn[MAX_NODE_NUM];//记录每一个节点的入度
int tag[MAX_NODE_NUM][MAX_NODE_NUM];
int n, m;//分别为图的节点的个数,和边的个数 bool topoSort(){
memset(ve, , sizeof(ve));
int cnt = ;//记录
for(int i=; i<=n; ++i)
if(degIn[i] == )
s.push(i);
while(!s.empty()){
int u = s.top();
s.pop();
t.push(u);
++cnt;
for(int e=first[u]; ~e; e=g[e].nextarc){
int v = g[e].v;
int w = g[e].w;
if(--degIn[v] == ) s.push(v);
if(ve[u] + w > ve[v]) ve[v] = ve[u] + w;
}
}
if(cnt < n) return false;//该有向图存在回路
return true;
} bool criticalPath() {//寻找关键路径
if(!topoSort()) return false;
for(int i=; i<=n; ++i)
vl[i] = ve[t.top()];
while(!t.empty()){//逆序拓扑排序,计算每个节点的最晚的发生时间
int u = t.top();
t.pop();
for(int e=first[u]; ~e; e=g[e].nextarc){
int v = g[e].v;
int w = g[e].w;
if(vl[v] - w < vl[u]) vl[u] = vl[v] - w;
}
} for(int i=; i<=n; ++i){//输出关节点
int ee = ve[i];//活动ai的最早的发生时间
for(int e=first[i]; ~e; e=g[e].nextarc) {
int v = g[e].v;
int w = g[e].w;
int ll = vl[v]-w;//活动ai的最晚的发生时间
ll == ee ? printf(" * ") : printf(" ");
printf("%d %d %d %d %d\n", i, v, w, ee, ll);//分别为 u, v, w(这条边所对应的活动), 活动最早发生时间和最晚发生时间
}
}
return true;
} void dfs(int u){
for(int e=first[u]; ~e; e=g[e].nextarc) {
int ee = ve[u];
int v = g[e].v;
int w = g[e].w;
dfs(v);
if(tag[u][v]) continue;
tag[u][v] = ;
if(vl[v]-w < vl[u]) vl[u] = vl[v]-w;
int ll = vl[v]-w;//活动au的最晚的发生时间
ll == ee ? printf(" * ") : printf(" ");
printf("%d %d %d %d %d\n", u, v, w, ee, ll);
}
} bool criticalPathx() {//寻找关键路径,利用dfs可以
if(!topoSort()) return false;
for(int i=; i<=n; ++i)
vl[i] = ve[t.top()];
dfs();//默认1节点为源点
} void addEdge(int u, int v, int w){
edge e(u, v, w, first[u]);
first[u] = g.size();
g.push_back(e);
} int main(){
printf("请输入图的节点的个数和边的个数:\n");
scanf("%d%d", &n, &m);
memset(first, -, sizeof(first));
while(m--){
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
addEdge(u, v, w);
++degIn[v];
}
//criticalPath();
/*输出结果:
* 1 3 2 0 0
1 2 3 0 1
2 4 2 3 4
2 5 3 3 4
3 6 3 2 5
* 3 4 4 2 2
* 4 6 2 6 6
5 6 1 6 7
*/
criticalPathx();
/*输出结果:
3 6 3 2 5
* 4 6 2 6 6
* 3 4 4 2 2
* 1 3 2 0 0
2 4 2 3 4
5 6 1 6 7
2 5 3 3 4
1 2 3 0 1
*/
return ;
} 输入数据:

6 8
1 2 3
2 5 3
5 6 1
2 4 2
4 6 2
3 4 4
1 3 2
3 6 3

 

AOE网的关键路径的计算的更多相关文章

  1. AOE网与关键路径简介

    前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程, ...

  2. 基于AOE网的关键路径的求解

    [1]关键路径 在我的经验意识深处,“关键”二字一般都是指临界点. 凡事万物都遵循一个度的问题,那么存在度就会自然有临界点. 关键路径也正是研究这个临界点的问题. 在学习关键路径前,先了解一个AOV网 ...

  3. _DataStructure_C_Impl:AOE网的关键路径

    //_DataStructure_C_Impl:CriticalPath #include<stdio.h> #include<stdlib.h> #include<st ...

  4. AOE网与关键路径

    声明:图片及内容基于https://www.bilibili.com/video/BV1BZ4y1T7Yx?from=articleDetail 原理 AOE网 关键路径 数据结构 核心代码 Topo ...

  5. 教你轻松计算AOE网关键路径(转)

    原文链接:http://blog.csdn.net/wang379275614/article/details/13990163 本次结合系统分析师-运筹方法-网络规划技术-关键路径章节,对原文链接描 ...

  6. 教你轻松计算AOE网关键路径

    认识AOE网 有向图中,用顶点表示活动,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV网络:AOV网络可以反应任务完成的先后顺序(拓扑排序). 在AOV网的边上加上权值表示完成该活动所需的 ...

  7. 数据结构关于AOV与AOE网的区别

    AOV网,顶点表示活动,弧表示活动间的优先关系的有向图. 即如果a->b,那么a是b的先决条件. AOE网,边表示活动,是一个带权的有向无环图, 其中顶点表示事件,弧表示活动,权表示活动持续时间 ...

  8. AOV图与拓扑排序&AOE图与关键路径

    AOV网:所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动.若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样活动在顶点上的有向图称为AOV网. 拓扑排序算 ...

  9. AOE网络的关键路径问题

    关于AOE网络的基本概念可以参考<数据结构>或者search一下就能找到,这里不做赘述. 寻找AOE网络的关键路径目的是:发现该活动网络中能够缩短工程时长的活动,缩短这些活动的时长,就可以 ...

随机推荐

  1. LintCode 78:Longest Common Prefix

      public class Solution { /** * @param strs: A list of strings * @return: The longest common prefix ...

  2. 使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)

    V20161028 由于项目原因,需要用到https去做一些事情. 这儿做了一些相应的研究. 这个https 用起来也是折腾人,还是研究了一周多+之前的一些积累. 目录 1,java client 通 ...

  3. (转)对博士学位说永别 by 王珢

    对博士学位说永别 by 王垠 经过深思熟虑之后,我决定再次“抛弃”我的博士学位.这是我第三次决定离开博士学位,也应该是最后一次了.这应该不是什么惊人的消息,因为我虽然读博士10年了,可是我的目标从来就 ...

  4. grunt 单独压缩多个js和css文件【转】

    原文地址:http://xiaomiya.iteye.com/blog/2177877 使用grunt来压缩前端js,css文件 因为最近做的客户端本地项目有用到十几个js,js提交之前都需要压缩.用 ...

  5. dns解析慢 修改的参数

    情况: ping域名时反应速度慢,ping ip却很正常 方法一:禁用ipv6 /etc/hosts中注释ipv6相关的 vim /etc/sysconfig/networks NETWORKING_ ...

  6. vue.js的基本操作

    1.{{message}}输出data数据中的message. 2.v-for="todo in todos"输出data数据中的dotos数组 3.v-on:click=&quo ...

  7. Spring MVC注解的一些案列

    1.  spring MVC-annotation(注解)的配置文件ApplicationContext.xml <?xml version="1.0" encoding=& ...

  8. navicat 结合快捷键

    ctrl+q 打开查询窗口ctrl+/ 注释sql语句ctrl+shift +/ 解除注释ctrl+r 运行查询窗口的sql语句ctrl+shift+r 只运行选中的sql语句F6 打开一个mysql ...

  9. 使用--gc-section编译选项减小程序体积

    本周在给程序添加功能的时候,突然发现,我只是写了几个函数,还没调用,size就变大了.这肯定是不行的嘛,没用的函数就应该不链接进来,占用我宝贵的空间. 这种功能,讲道理编译器肯定要支持的,于是搜了一下 ...

  10. 安卓中的Model-View-Presenter模式介绍

    转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0425/2782.html 英文原文:Introduction to M ...