最近一直被概率论所虐,今天要交作业于是乎昨天急急忙忙的写完了,里面有个关于关键路径的东西,以前没有见过也感觉没啥用所以一直拖到现在才学。=-=拖延症啊。

什么叫关键路径。

在一个有向图中,如果用顶点表示事件,弧表示活动,弧上对应的权值表示活动持续的时间,那么称这个有向图为AOE网,常用于估算工程的完成时间。

(AOV网:在一个有向图中,如果以顶点表示活动,用顶点之间的关系来表示活动的先后关系,那么称此有向图为AOV网,用于分析工程各项子任务的完成先后顺序,即拓扑排序。)

关键路径为AOE网中从顶点到汇点路径长度最长的路径称为关键路径。

关键路径中主要有以下术语:
活动开始的最早时间e[i]
活动开始的最晚时间l[i]
事件开始的最早时间ve[i]
事件开始的最晚时间vl[i]

其中,关键活动就是找那些e[i]=l[i]的活动
为了求得e[i]和l[i],首先应该知道事件的字早发生时间和最迟发生时间。如果活动ai由弧<i,j>表示,其持续时间为dut<i,j>,则有如下关系:
e[i]=ve[i]
l[i]=vl[k]-dut(<j,k>)
求解ve[j]和vl[j]需分两个步骤进行:
求拓扑序从前往后求ve,ve[j]=max(ve[i]+dut(<i,j>)
逆拓扑序从后往前求vl,vl[i]=min(vl[j]-dut(<i,j>)
其中,ve[0]=0,vl[n-1]=ve[n-1];

其实只要求一遍拓扑序,在求的时候得到ve然后利用已经生成的拓扑序求vl即可。

求关键路径的算法分析
(1) 求关键路径必须在拓扑排序的前提下进行,有环图不能求关键路径;

(2) 只有缩短关键活动的工期才有可能缩短工期;
(3) 若一个关键活动不在所有的关键路径上,减少它并不能减少工期;
(4) 只有在不改变关键路径的前提下,缩短关键活动才能缩短整个工期。

下面是实现代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<iostream>
#include<cmath>
using namespace std;
#define maxn 1000
int head[maxn];
int cnt;
struct eg
{int u,next;int w;
}edge[maxn*maxn*2];
void add(int u,int v,int w)
{edge[cnt].u=u;edge[cnt].w=w;edge[cnt].next=head[v];head[v]=cnt++;
}
int n;
int ve[maxn];
int vl[maxn];
int ind[maxn];
stack<int> T;
void ini()
{memset(head,-1,sizeof(head));cnt=0;while(!T.empty())T.pop();memset(edge,0,sizeof(edge));memset(ind,0,sizeof(ind));memset(ve,0,sizeof(ve));memset(vl,0,sizeof(vl));
}
void topo()
{stack<int> s;while(!s.empty())s.pop();int cnt=0;for(int i=0;i<n;i++)if(ind[i]==0){s.push(i);break;}while(!s.empty()){int tmp=s.top();T.push(tmp);for(int k=head[tmp];~k;k=edge[k].next){int i=edge[k].u;if(--ind[i]==0)s.push(i);if(ve[tmp]+edge[k].w>ve[i])ve[i]=edge[k].w+ve[tmp];}}if(cnt<n){printf("circle");return;}
}
void getCriticalPath()
{topo();while(!T.empty()){int j=T.top();T.pop();for(int p=head[j];~p;p=edge[p].next){int k=edge[p].u;if(vl[k]-edge[p].w<vl[j])vl[j]=vl[k]-edge[p].w;}}for(int i=0;i<n;i++){for(int p=head[i];~p;p=edge[p].next){int k=edge[p].u;if(ve[k]==vl[k]-edge[p].w)printf("%d %d %d\n",i,k,dege[p].w);}}
}
int main()
{int m;while(~scanf("%d%d",&n,&m)){ini();for(int i=0;i<m;i++){int a,b,w;scanf("%d%d%d",&a,&b,&w);ind[b]++;add(a,b,w);}getCriticalPath();}return 0;
}

关键路径算法以及实现相关推荐

  1. 第5-6课:关键路径算法

    作为一个项目经理或工程总监,他最关心的两个问题就是工程是否能顺理进行和整个工程的最短完成时间.第5-2课讲了拓扑排序算法,对应了第一个问题的解决方案,这一课将介绍关键路径算法,就是为了解决第二个问题, ...

  2. AOE网与关键路径、关键路径算法

    AOE网与关键路径 在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动持续的时间,称这样的有向图为边表示活动的网,简称 AOE网(activity on edge ne ...

  3. DAG 图关键路径算法

    关键路径 如果DAG图拓扑有序,那么此图可以转换成线性的先后关系,而不需要回退去访问数据.如果项目安排的事件拓扑有序,那么此项目中的各个事件的依存关系不可以解耦,不会形成连环套而致使项目无法开展.项目 ...

  4. 【数据结构】什么的图的关键路径?关键路径相关概念?关键路径算法实现?

    目录 一.什么是关键路径? 1.现实问题 二.关键路径相关概念? 三.关键路径算法实现? 1.算法分析 2.算法步骤 3.算法实现 一.什么是关键路径? 关键路径:若有向图中,各顶点表示事件,各有向边 ...

  5. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  6. 软件项目活动图关键路径算法演示(转载)

    如上图,是一个AOE网,点表示状态,边表示活动及其所需要的时间.为了求出关键路径,我们使用一下算法: 1.求出到达各个状态的最早时间(按最大计) 这个过程是要从源点开始向汇点顺推: V1是源点,其最早 ...

  7. 数据结构-----图的拓扑排序和关键路径算法

    部分图片取自:http://www.cnblogs.com/navorse/articles/1893863.html 在介绍拓扑排序和关键路径之前,先引入AOE网络的概念: 该图为一个AOE网,顶点 ...

  8. C++实现AOE网中的关键路径算法(邻接表存储)

    代码如下: #include <iostream> #include <stack> #include <string> using namespace std; ...

  9. 关键路径算法中的etv和ltv的理解

    etv和ltv的定义 etv:事件的最早发生时间 ltv:事件的最晚发生时间 (再晚会耽误工期) 关键路径是源点到汇点权值最大的一条路径,这条路径决定了整个工期.关键路径上的关键活动的最早开始的时间和 ...

最新文章

  1. Python+Selenium自动化
  2. python numpy.savetxt(),np.column_stack保存(多行/列)数据 保存多维数组
  3. 查看进程运行状态的环境变量
  4. 中文 Python 开源资料合集!这应该是最全的了!
  5. 【算法分析与设计】浅析算法复杂度
  6. 数据分析sql面试必会6题经典_师兄大厂面试遇到这条 SQL 数据分析题,差点含泪而归!...
  7. vc++ windows 创建桌面快捷方式
  8. (转)学习淘淘商城第二十二课(KindEditor富文本编辑器的使用)
  9. Dstream的action算子与RDD的action算子
  10. 【UVA1599】Ideal Path理想路径--两种约束条件(!!双向bfs+非简单图的最短路+无向图邻接记录法)
  11. android调weex方法,Android集成weex汇总
  12. Python爬虫 批量采集京东商品数据,实时了解商品价格走势
  13. 计算机基础知识之工作总结,计算机教师工作总结(精选3篇)
  14. EAN-13 条形码编程示例
  15. 靠谱的录屏软件 + mp4格式转换软件
  16. ssh连接Linux机器一直让输入密码
  17. 电脑html动态桌面壁纸制作,电脑如何制作动态壁纸_电脑上怎么搞动态壁纸-win7之家...
  18. BugkuCTF misc 旋转跳跃
  19. 教妹学Java:不可不知的 Unicode 之锟斤拷
  20. 怎么抓雷电模拟器的包_fiddler+雷电模拟器进行APP抓包(可抓HTTPS)

热门文章

  1. [附源码]JAVA+ssm计算机毕业设计党员学习管理系统(程序+Lw)
  2. 【使用Python编写一个访问实时股票数据的工具】包括获取股票信息、与数据库交互等
  3. Android开发学习思维导图
  4. Activity 过度动画让界面切换实现如牛奶般润滑的切换
  5. 计算机专业好还是铁路好,重庆市铁路职业学校的计算机专业好吗
  6. Linux清除arp缓存
  7. android 自带网络共享,安卓手机如何共享自身网络
  8. Oracle怎么新增删除表分区
  9. Oracle增加表分区
  10. 收集的一些 美丽的英文句子