关键路径分析

一条有向边E,权值为EdgeValue,点i指向点j,称呼点i为始点,点j为终点。

事件最早发生时间ve:只要始点(多个)都已准备好就立即行动,即选择始点(多个)中最早发生时间最晚的。

ve(j)=max{ve(i)+EdgeValue}

事件最晚发生时间vl:选择事件最晚发生时间,使终点(多个)到达后刚好不会发生问题,即选择终点(多个)中最晚发生时间最早的。

vl(i)=min{vl(j)-EdgeValue}

活动最早发生时间l:只要始点(一个)都已准备好就立即行动,即选择始点(一个)最早发生时间。

l(E)=vl(i)

活动最晚发生时间e:选择事件最晚发生时间,使终点(一个)到达后刚好不会发生问题,即选择终点(一个)中最晚发生时间最早的。

e(E)=ve(j)-EdgeValue

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <malloc.h>
  4 #define maxn 1000
  5
  6 struct node
  7 {
  8     long d; //点
  9     long value; //边权值
 10     struct node *next;
 11 }*in[maxn+1],*out[maxn+1];
 12 //in:某点作为边的终点,所有对应边的始点
 13 //out:某点作为边的始点,所有对应边的终点
 14 //编号为k的边的始点和终点为x[k]和y[k],权值为z[k]
 15 //点k的出度为g[k]
 16 //队列为q
 17 //ve(early),vl(late),e,l分别为事件最早,最晚发生时间,活动最早,最晚发生时间
 18 long x[maxn+1],y[maxn+1],z[maxn+1],g[maxn+1],q[maxn+1],ve[maxn+1],vl[maxn+1],e[maxn+1],l[maxn+1];
 19
 20 long max(long a,long b)
 21 {
 22     if (a>b)
 23         return a;
 24     else
 25         return b;
 26 }
 27
 28 long min(long a,long b)
 29 {
 30     if (a>b)
 31         return b;
 32     else
 33         return a;
 34 }
 35
 36 int main()
 37 {
 38     long n,m,head,tail,i,s,t;
 39     struct node *p;
 40     scanf("%ld%ld",&n,&m);
 41     //init
 42     for (i=1;i<=n;i++)
 43         g[i]=0;
 44     for (i=1;i<=m;i++)
 45     {
 46         scanf("%ld%ld%ld",&x[i],&y[i],&z[i]);
 47         g[y[i]]++;
 48         p=(struct node *) malloc (sizeof(struct node));
 49         p->d=y[i];
 50         p->value=z[i];
 51         p->next=out[x[i]];
 52         out[x[i]]=p;
 53     }
 54
 55     head=0;
 56     tail=0;
 57     for (i=1;i<=n;i++)
 58         if (g[i]==0)
 59         {
 60             tail++;
 61             q[tail]=i;
 62         }
 63
 64     //init
 65     for (i=1;i<=n;i++)
 66         ve[i]=0;
 67     while (head<tail)
 68     {
 69         head++;
 70         s=q[head];
 71         p=out[s];
 72         while (p!=NULL)
 73         {
 74             t=p->d;
 75             g[t]--;
 76             ve[t]=max(ve[t],ve[s]+p->value);
 77             if (g[p->d]==0)
 78             {
 79                 tail++;
 80                 q[tail]=p->d;
 81             }
 82             p=p->next;
 83         }
 84     }
 85     if (tail<n)
 86     {
 87         printf("has loop\n");
 88         exit(1);
 89     }
 90
 91     //init
 92     for (i=1;i<=n;i++)
 93         vl[i]=2000000000;
 94     vl[q[tail]]=ve[q[tail]];
 95     for (i=tail;i>=1;i--)
 96     {
 97         s=q[i];
 98         p=out[s];
 99         while (p)
100         {
101             vl[s]=min(vl[s],vl[p->d]-p->value);
102             p=p->next;
103         }
104     }
105
106     for (i=1;i<=m;i++)
107     {
108         e[i]=ve[x[i]];
109         l[i]=vl[y[i]]-z[i];
110     }
111     for (i=1;i<=m;i++)
112         if (e[i]==l[i])
113             printf("%ld ",i);
114     return 0;
115 }
116 /*
117 9 11
118 7 9 2
119 8 9 4
120 5 7 8
121 5 8 7
122 6 8 4
123 2 5 1
124 3 5 1
125 4 6 2
126 1 2 6
127 1 3 4
128 1 4 5
129 */
时间: 2024-10-26 16:40:24

关键路径分析的相关文章

关键链 (项目管理方法)

关键链(Critical Chain)是由高德拉特(Eli Goldratt)博士提出的一种基于约束理论(Theory of Constraints)的项目管理方法. 关键链项目管理 关键链项目管理基于从约束理论导出的方法和算法. CCPM的概念于1997年在Eliyahu M. Goldratt的书“关键链”中引入. CCPM的应用被认为比1910年至1950年代开发的传统方法(即CPM,PERT,甘特等)更快和/或更便宜地实现10%至50%的项目. 根据Standish Group和其他公司

图论算法 有图有代码 万字总结 向前辈致敬

图的定义 背景知识 看到这篇博客相信一开始映入读者眼帘的就是下面这幅图了,这就是传说中的七桥问题(哥尼斯堡桥问题).在哥尼斯堡,普雷格尔河环绕着奈佛夫岛(图中的A岛).这条河将陆地分成了下面4个区域,该处还有着7座连接这些陆地的桥梁. 问题是如何从某地出发,依次沿着各个桥,必须经过每座桥且每座桥只能经过1次,最终回到原地. 不知道这个问题且好奇的童鞋现在肯定在忙活着找出来这道题的结果了. 是伟大的数学家欧拉(Leonhard Euler)在1736年首次使用图的方法解决了该问题. 欧拉将上面的模

《信息系统项目管理师教程》读书笔记—第一章 绪论

1.1 什么是项目 1.1.1 项目的定义 项目(Project)是为提供某项独特的产品.服务或成果所进行的临时的一次性努力. 项目的特点: (1)临时性 (2)独特的产品.服务或成果 (3)渐进明细(Progressive Elaboration) 1.1.2 信息系统项目的特点 典型的信息系统项目有如下特点: 目标不明确 需求变化频繁 智力密集型 设计队伍庞大 设计人员高度专业化 涉及的承包商多 各级承包商分布在各地,相互关系复杂 系统集成项目中需研制开发大量的软硬件系统 项目生命期通常较短

gantt甘特图的制作过程

甘特图主要是用来做项目管理的,可以清楚的看到任务间的逻辑关系,任务与时间关系和任务间并行关系. 在甘特图中,横轴方向表示时间,纵轴方向并列着活动列表.图表内可以用线条.数字.文字代号等来表示计划(实际)所需时间,计划(实际)输出,计划(实际)开工或完工时间等. 1.根据计划列出所有任务 对于每一个任务,不管这项任务是并行任务或者是线性任务,列出任务的启动时间,估算完成该任务所需要花费的时间.如果本项任务是线性任务,同时也列出这项任务所依赖的任务,最后使用表格的方式将所有的任务按先后顺序列出.下面

项目管理的五个过程和九大知识领域

项目管理的五个过程和九大知识领域     项目是为完成某一独特的产品或服务所做的一次性努力.根 据这个定义,项目就具有了目标明确性.活动一次性及资源消耗性等特性.换句话说,具备前面三个主要特性的活动,都可以看作是项目.现实中的项目随处可见, 如设备消缺.会议组织.技术竞赛.结婚典礼以及家居装修等等,都可以看作是项目.在这些项目的实施过程中,都存在项目管理问题,不过,实际生活与工作中, 可能更多关注的事情本身,而对做好事情相关的组织.计划.控制等过程相对缺少关注,或者没有经验与能力加以关注. 项目

【数据结构】拓扑排序、最短路径算法、Dijkstra算法、无环图等等

图的定义 图(graph)G = (V,E)由顶点(vertex)的集V和边(Edge)的集E组成.有时也把边称作弧(arc),如果点对(v,w)是有序的,那么图就叫做有向的图(有向图).顶点v和w邻接(adjacent)当且仅当(v,w)属于E. 如果无向图中从每一个顶点到其他每个顶点都存在一条路径,则称该无向图是连通的(connected).具有这样性质的有向图称为是强连通的(strongly connected).如果有向图不是强连通的,但它的基础图(underlying graph)(也

2017.07.06 IT项目管理笔记整理 第四章

进度是对执行的活动和里程碑所制定的工作计划日期表. 进度问题是项目生命周期内造成项目冲突的主要原因. 时间管理原则: 1.区分重要与紧急的关系 2.适当运用Pareto原则 3.合理预算 4.有限反应 5.果断决策 6.大胆.完整的授权 7.例外管理 8.效能与效率 9.活动与效果 时间管理技巧: 1.每日计划 2.预料 3.分析时间 4.最后时限 5.上交问题 6.合并 7.反馈 8.计划躲避 9.可见性 10.习惯软件项目进度管理的主要过程: 1活动定义,确定项目团队成员和项目干系人为完成项

Scrum总结

Scrum总结一个轻量级的软件开发方法 Scrum是一个敏捷开发框架,是一个增量迭代的开发过程..在这个框架整个开发周期由若干个小的跌代周期,每个小的的跌代周期称为一个Sprint,每个Sprint的长度2到4周.在每个Sprint中,Scrum的开发团队拿到一个排列好优先级的需求列表,我们称它为用户故事或者叫Sprint backlog, 所以我们先开发的是对客户具有较高价值的需求.  在每个迭代结束后,都会开发完成可交付的产品. 一个简单的框架 Scrum由三个角色,三种活动,3种交付物组成

数据结构与算法分析(五)——最短路径算法

0) 引论 正如名字所言,最短路径算法就是为了找到一个图中,某一个点到其他点的最短路径或者是距离. 最短路径算法一般分为四种情况: a) 无权重的最短路径 b) 有权重的最短路径 c) 边的权重为负的图 d) 无圈的图 ps:上面的情况针对的都是有向图. 1) 无权重的最短路径 下图是一个例子:假设我们取点v3作为初始点,计算点v3到图中所有点的路径以及距离(包括点v3). a) v3到v3的路径长为0. b) 沿着v3的邻接点查找,找到v1,那么v3到v1的路径长为1:找到v6,那么v3到v6