基于数据结构的关键路径算法
数据结构中的关键路径算法解析

数据结构中的关键路径算法解析关键路径算法是一种用于确定项目关键路径的方法,它可以帮助我们找到项目中耗时最长的路径,从而可以合理地安排任务和资源,提高项目完成的效率。
在数据结构中,关键路径算法也有着重要的应用。
本文将对数据结构中的关键路径算法进行解析和讨论。
一、什么是关键路径算法?关键路径算法是一种基于网络图的分析工具,它通过构建工程项目的网络模型,确定项目中的关键路径,以便更好地控制和管理项目进度。
关键路径是指项目中最长时间的路径,这条路径上的每个任务都是不能延误的,否则将会对整个项目的完成时间产生直接影响。
二、关键路径算法的基本步骤1. 创建网络图:将项目的任务和其所需的时间以及任务之间的依赖关系表示为有向无环图(DAG),其中顶点表示任务,边表示任务之间的依赖关系。
2. 计算任务的最早开始时间(ES)和最迟开始时间(LS):从图的起点开始,依次计算每个任务的最早开始时间,即该任务能够开始执行的最早时间;然后从图的终点开始,逆序计算每个任务的最迟开始时间,即该任务必须在何时开始以保证项目能够按时完成。
3. 计算任务的最早完成时间(EF)和最迟完成时间(LF):根据任务的最早开始时间和所需时间计算出任务的最早完成时间,即该任务能够完成的最早时间;然后根据任务的最迟开始时间和所需时间计算出任务的最迟完成时间,即该任务必须在何时完成以保证项目能够按时完成。
4. 计算任务的总时差(TF):总时差等于任务的最迟完成时间减去最早完成时间,表示任务可以延误的时间。
5. 确定关键路径:根据任务的总时差,将总时差为零的任务连接起来,形成关键路径。
三、关键路径算法的实例为了更好地理解关键路径算法的应用,我们以一个简单的工程项目为例进行说明。
假设有以下任务需要完成:任务A:7天任务B:5天任务C:10天任务D:6天任务E:3天任务F:8天任务之间的依赖关系如下所示:A ->B -> D -> FA -> C -> E -> F首先,我们可以根据这些任务和依赖关系创建一个有向无环图(DAG),然后按照上述算法的步骤进行计算。
数据结构课程设计报告——关键路径

《数据结构》课程设计报告课程题目:关键路径学院:班级:学号:XX:指导教师:完成日期:目录一、需求分析3二、概要设计4三、详细设计5四、调试分析11五、用户使用说明12六、测试结果13七、附录13一、需求分析1、问题描述AOE网(即边表示活动的网络),在某些工程估算方面非常有用。
它可以使人们了解:(1)研究某个工程至少需要多少时间?(2)哪些活动是影响工程进度的关键? 在AOE网络中,从源点到汇点的有向路径可能不止一条,但只有各条路径上所有活动都完成了,这个工程才算完成。
因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和,这条路径就叫做关键路径(critical path)。
2、设计步骤(1)、以某一工程为蓝本,采用图的结构表示实际的工程计划时间。
(2)、调查并分析和预测这个工程计划每个阶段的时间。
(3)、用调查的结果建立AOE网,并用图的形式表示。
(4 )、用CreateGraphic ()函数建立图的邻接表存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中。
(5)、用SearchMaxPath()函数求出最大路径,并打印出关键路径。
(6)、编写代码并调试、测试通过。
3、测试数据○v2○v5○v1○v4○v6○v36v1 v2 v3 v4 v5 v68v1 v2 a1 3v1 v3 a2 2v2 v4 a3 2v2 v5 a43v3 v4 a5 4v3 v6 a6 3v4 v6 a7 2v5 v6 a8 1二、概要设计为了实现上述函数功能:1、抽象数据类型图的定义如下:ADT Graph {数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR};VR={<v,w>|v,w∈V,且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义和信息}基本操作:InitGraph(G);初始条件:图G存在。
数据结构的应用的拓扑排序与关键路径算法

数据结构的应用的拓扑排序与关键路径算法拓扑排序与关键路径算法是数据结构中重要的应用之一。
拓扑排序通过对有向图的节点进行排序,使得对于任意一条有向边(u,v),节点 u 在排序中都出现在节点 v 之前。
关键路径算法则是用来确定一个项目的关键活动和最短完成时间。
拓扑排序的实现可以通过深度优先搜索或者广度优先搜索来完成。
深度优先搜索是递归地访问节点的所有未访问过的邻居节点,直到没有未访问过的邻居节点为止,然后将该节点添加到拓扑排序的结果中。
广度优先搜索则是通过使用队列来实现的,将节点的邻居节点逐个入队并进行访问,直到队列为空为止。
无论使用哪种方法,拓扑排序都可以通过判断节点的入度来进行。
拓扑排序在很多实际问题中都有广泛应用。
比如在任务调度中,拓扑排序可以用来确定任务间的依赖关系和执行顺序;在编译原理中,拓扑排序可以用来确定程序中变量的定义和使用顺序。
关键路径算法用于确定项目中的关键活动和最短完成时间。
它通过计算每个活动的最早开始时间和最晚开始时间,以及每个活动的最早完成时间和最晚完成时间来实现。
具体步骤如下:1. 构建有向加权图,其中节点表示项目的活动,有向边表示活动间的先后关系,边的权重表示活动的持续时间。
2. 进行拓扑排序,确定活动的执行顺序。
3. 计算每个活动的最早开始时间,即从起始节点到该节点的最长路径。
4. 计算每个活动的最晚开始时间,即从终止节点到该节点的最长路径。
5. 根据每个活动的最早开始时间和最晚开始时间,可以确定关键活动,即最早开始时间与最晚开始时间相等的活动。
6. 计算整个项目的最短完成时间,即从起始节点到终止节点的最长路径。
拓扑排序与关键路径算法在工程管理、任务调度、生产流程优化等领域都有重要应用。
它们能够帮助我们有效地组织和管理复杂的项目,提高工作效率和资源利用率。
在实际应用中,我们可以借助计算机编程以及各种图算法库来实现这些算法,从而更快速、准确地解决实际问题。
综上所述,拓扑排序与关键路径算法是数据结构的重要应用之一。
数据结构与算法的学习路径和技术路线

数据结构与算法的学习路径和技术路线数据结构与算法是计算机科学中非常重要的基础知识,对于想要成为优秀程序员的人来说,掌握好数据结构与算法是必不可少的。
本文将为大家介绍数据结构与算法的学习路径和技术路线,帮助大家更好地规划学习计划,提升编程能力。
一、数据结构与算法的重要性数据结构是指数据对象以及数据对象之间的关系,算法是解决特定问题的步骤和方法。
数据结构与算法的设计直接影响到程序的效率和性能,良好的数据结构与算法可以提高程序的执行效率,降低资源消耗。
因此,掌握数据结构与算法对于编程人员来说至关重要。
二、数据结构与算法的学习路径1. 初级阶段在初级阶段,建议从最基础的数据结构和算法开始学习,包括数组、链表、栈、队列、递归等。
这些基础知识是后续学习的基础,要扎实掌握。
2. 中级阶段在掌握了基础知识之后,可以深入学习一些高级数据结构和算法,如树、图、排序算法、查找算法等。
这些知识点涉及到更复杂的数据结构和算法设计,需要花费更多的时间和精力去理解和掌握。
3. 高级阶段在掌握了中级知识之后,可以进一步学习一些高级数据结构和算法,如动态规划、贪心算法、回溯算法等。
这些知识点是算法设计中的难点,需要深入思考和实践才能掌握。
三、数据结构与算法的技术路线1. 多练习掌握数据结构与算法最重要的方法就是多练习,通过不断地练习算法题目来提升自己的编程能力。
可以选择一些在线刷题平台,如LeetCode、牛客网等,每天坚持练习一定数量的算法题目。
2. 学习算法思想除了掌握具体的数据结构和算法知识外,还要学习算法的设计思想,如分治法、动态规划、贪心算法等。
了解不同算法思想的应用场景和解题方法,有助于提高解题效率。
3. 参与项目实践在实际项目中应用数据结构与算法是提升编程能力的有效途径。
可以参与一些开源项目或者自己动手实现一些算法,锻炼自己的编程能力和算法设计能力。
四、总结数据结构与算法是编程人员必备的基础知识,掌握好数据结构与算法对于提升编程能力和解决实际问题至关重要。
数据结构课程设计关键路径

数据结构课程设计关键路径数据结构课程设计-关键路径#define max 20#include#include#includeusing namespace std;typedef struct ArcNode//定义表结点{int adjvex;//该弧所指向顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针int info;//该弧的权值}ArcNode;typedef struct VNode//定义头结点{int data;//顶点信息ArcNode *firstarc;//指向第一条依附该顶点的弧的指针}VNode,AdjList[max];typedef struct//定义ALGraph{AdjList vertices;int vexnum,arcnum;//图的当前顶点数和弧数int kind;//图的种类标志}ALGraph;typedef struct//定义栈{int *base;//栈底int *top;//栈顶}stack;void initstack(stack &s)//建立空栈{s.base=(int*)malloc(max*sizeof(int)); s.top=s.base;}int stackempty(stack s)//判断是否为空栈{if(s.base==s.top)return 1;else return 0;}int stackfull(stack s)//判断是否为满栈{if(s.top-s.base>=max) return 1;else return 0;}int pop(stack &s)//进行出栈{int e;//出栈先进行赋值,后移动指针if(!stackempty(s)){e=*(s.top-1);s.top--;return e;}else return NULL;}void push(stack &s,int e)//进行入栈{if(!stackfull(s)){s.top++;//进栈先移动指针,后进行赋值*(s.top-1)=e;}}void CreateDG(ALGraph &G)//创建邻接表的图{int k,i,j;char tag;cout<<"请输入图的顶点数目:"<>G.vexnum;cout<<"请输入图的弧的数目:"<>G.arcnum;cout<<"请确认是否输入弧的权值(y/n):"<<endl;< p="">cin>>tag;for(i=1;i<=G.vexnum;++i){G.vertices[i].data=i;//初始化顶点值G.vertices[i].firstarc=NULL;//初始化指针}cout<<"请输入弧的相关信息arc(V1-->V2)"<{cout<<endl<<"请输入弧头"<<"[1,"<<g.vexnum<<"]:";< p="">cin>>i;cout<<"请输入弧尾"<<"[1,"<<g.vexnum<<"]:";< p="">cin>>j;while(i<1||i>G.vexnum||j<1||j>G.vexnum)//如果弧头或弧尾不合法,重新输入{cout<<endl<<"请再次输入弧头"<<"[1,"<<g.vexnum<<"]:";< p="">cin>>i;cout<<"请再次输入弧尾"<<"[1,"<<g.vexnum<<"]:";< p=""> cin>>j;}ArcNode *p;p=(ArcNode*)malloc(sizeof(ArcNode));//分配内存if(!p){cout<<"Overflow!";//如果没有足够的空间,则退出}p->adjvex=j;//对弧结点的弧顶点数据域赋值p->nextarc=G.vertices[i].firstarc;//对弧结点下一条弧指针域赋值p->info=0; // 对弧结点相关信息指针域赋值G.vertices[i].firstarc=p; // 将弧结点插入到对应的单链表if(tag=='y'){cout<<"请输入弧的权值:";cin>>p->info;}}}void ShowMGraph(ALGraph G)//输出图G{int j;ArcNode *p;for(j=1;j<=G.vexnum;++j){if(G.vertices[j].firstarc)cout<<g.vertices[j].data<<"->";</g.vertices[j].data<<"->else cout<<g.vertices[j].data<<">";</g.vertices[j].data<<"> for(p=G.vertices[j].firstarc;p;p=p->nextarc)cout<adjvex<<" "<info<<" "<adjvex<<"->"; cout<<endl;< p="">}}int degree(ALGraph G,int i)//求各顶点的入度{int *indegree,j,k;indegree=(int*)malloc((G.vexnum+1)*sizeof(int)); ArcNode *p;for(j=1;j<=G.vexnum;j++)indegree[j]=0;for(j=1;j<=G.vexnum;j++){for(p=G.vertices[j].firstarc;p;p=p->nextarc) {k=p->adjvex;++indegree[k];}}return indegree[i];}void critical(ALGraph G)//输出关键活动{ArcNode *p;int i,k,r,j,*ve,*vl,ee,el,count=0;int *indegree,length;indegree=(int*)malloc(G.vexnum*sizeof(int));ve=(int*)malloc((G.vexnum+1)*sizeof(int));vl=(int*)malloc((G.vexnum+1)*sizeof(int)); stack S,T;initstack(T);initstack(S);//一,求各顶点的入度for(j=1;j<=G.vexnum;j++)indegree[j]=degree(G,j);//二,求各顶点最早发生的时间vefor(j=1;j<=G.vexnum;j++)//入度为零则进栈if(indegree[j]==0)push(S,j);for(j=1;j<=G.vexnum;j++)//对该数组初始化ve[j]=0;while(!stackempty(S)){i=pop(S);push(T,i);++count;for(p=G.vertices[i].firstarc;p;p=p->nextarc) {k=p->adjvex; //顶点位置if(--indegree[k]==0) push(S,k);r=p->info;if(ve[i]+r>ve[k])ve[k]=ve[i]+r;}//for结束}//while结束if(count<<"aoe网有回路!"<<endl;<="">return;}//三,求各顶点的最迟时间for(j=1;j<=G.vexnum;j++)//对vl数组进行初始化vl[j]=ve[G.vexnum];while(!stackempty(T)){j=pop(T);for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;r=p->info;if(vl[k]-r<vl[j])< p="">vl[j]=vl[k]-r;}}//四,对活动的最早时间和最迟时间比较cout<<"================================= ============= ================"<<endl;< p=""> printf(" 起点终点最早开始时间最迟完成时间差值备注\n"); for(j=1;j<=G.vexnum;j++)for(p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;r=p->info;ee=ve[j]; el=vl[k]-r;printf("%4d %4d %4d %4d %4d ",j,k,ve[j],vl[k]-r,vl[k]-r-ve[j]);if(ee==el)cout<<" 是关键活动"<<endl;< p="">elsecout<<" 不是关键活动"<<endl;< p="">}//for结束cout<<"================================= ============= ================"<<endl;< p=""> length=ve[G.vexnum];cout<<endl<<"2.关键路径长度为:"<<endl;< p="">cout<<" "<<length<<="">}int main()//主函数{ALGraph G;cout<<"=============================="<< endl;< p="">cout<<"======1.创建邻接表图=========="<<endl;< p="">cout<<"======2.输出邻接表图=========="<<endl;< p="">cout<<"======3.寻找关键活动=========="<<endl;< p="">cout<<"======4.退出=================="<<endl;< p="">cout<<"=============================="<< endl;< p="">cout<<"请选择操作:"<<endl;< p="">int a;l1:{cin>>a;}system("cls");while(a<=4){switch(a){case 1:cout<<"请正确创建邻接表图:"<<="" p="">cout<<"Create ALGraph success !"<<<"请选择操作:"<<endl;<="" p="">goto l1;break;case 2:cout<<"输出该邻接表图如下:"<<<"="<<endl; ShowMGraph(G);</p><p>cout<<" p="" 该图输出完毕!"<<endl;<="">cout<<"=================="<<<"请选择操作:"<<endl;<="" p="">goto l1;break;case 3:cout<<"1.输出关键活动如下:"<<="" p="">cout<<"请选择操作:"<<endl;< p="">goto l1;break;case 4:return 0;}}return 0;}</endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></endl;<></length<</endl<<"2.关键路径长度为:"<<endl;<></endl;<></endl;<></endl;<></endl;<></vl[j])<></endl;<></g.vexnum<<"]:";<></endl<<"请再次输入弧头"<<"[1,"<<g.vexnum<<"]:";<> </g.vexnum<<"]:";<></endl<<"请输入弧头"<<"[1,"<<g.vexnum<<"]:";<></endl;<>。
关键路径计算方法

关键路径计算方法关键路径是项目管理中的一个重要概念,通过关键路径的计算可以确定项目的最短工期和关键任务,帮助项目经理和团队成员合理安排工作,提高项目的执行效率和成功率。
本文将介绍关键路径计算的方法和步骤。
一、关键路径的定义关键路径是指在项目网络图中,连接起始节点和终止节点的最长路径。
在这条路径上的任务被称为关键任务,它们的完成时间直接影响整个项目的工期。
如果关键任务延迟完成,整个项目的工期将延迟。
二、关键路径的计算方法关键路径的计算方法有两种,分别是前置法和后置法。
下面将详细介绍这两种方法的步骤。
1. 前置法的计算步骤:(1)绘制项目网络图,标注任务和其所需时间。
(2)计算每个任务的最早开始时间(EST)和最早完成时间(EFT)。
(3)计算每个任务的最晚开始时间(LST)和最晚完成时间(LFT)。
(4)根据计算得到的EST、EFT、LST、LFT,确定每个任务的浮动时间(TF)。
(5)找出浮动时间为0的任务,这些任务即为关键任务。
(6)按照关键任务的排列顺序,确定关键路径。
2. 后置法的计算步骤:(1)绘制项目网络图,标注任务和其所需时间。
(2)计算每个任务的最晚开始时间(LST)和最晚完成时间(LFT)。
(3)计算每个任务的最早开始时间(EST)和最早完成时间(EFT)。
(4)根据计算得到的EST、EFT、LST、LFT,确定每个任务的浮动时间(TF)。
(5)找出浮动时间为0的任务,这些任务即为关键任务。
(6)按照关键任务的排列顺序,确定关键路径。
三、关键路径计算的应用关键路径计算可以帮助项目经理和团队成员合理安排工作,提高项目的执行效率和成功率。
具体应用包括以下几个方面:1. 确定项目的最短工期:通过关键路径的计算,可以确定项目的最短工期,避免工期延误和浪费资源。
2. 优化资源分配:关键路径计算可以帮助项目经理合理安排资源,避免资源过度或不足,提高资源利用率。
3. 提前预警和风险控制:通过关键路径的计算,可以提前预警可能延误的任务,及时采取措施进行调整和风险控制。
数据结构 关键路径

l-e 0✓ 2
3 0✓ 2 3 0✓ 0✓ 3 0✓ 0✓
– 算法实现
• 以邻接表作存储结构
• 从源点V1出发,令Ve[1]=0,按拓扑序列求各顶点的Ve[i]
• 从汇点Vn出发,令Vl[n]=Ve[n],按逆拓扑序列求其余各顶 点的Vl[i]
• 根据各顶点的Ve和Vl值,计算每条弧的e[i]和l[i],找出 e[i]=l[i]的关键活动
Ch6_6.c
370
– 算法分析:T(n)=O(n³)
012 path= 3 0 2
310
– 从T中选取一个其距离值为最小的顶点W,加入S – 对T中顶点的距离值进行修改:若加进W作中间顶点,从V0
到Vi的距离值比不加W的路径要短,则修改此距离值 – 重复上述步骤,直到S中包含所有顶点,即S=V为止
0 8 2
32 13 1
35
97 6
03 62
5 17
4
终点
从V0到各终点的最短路径及其长度
• 迪杰斯特拉(Dijkstra)算法思想
按路径长度递增次序产生最短路径算法: 把V分成两组: (1)S:已求出最短路径的顶点的集合 (2)V-S=T:尚未确定最短路径的顶点集合 将T中顶点按最短路径递增的次序加入到S中, 保证:(1)从源点V0到S中各顶点的最短路径长度都不大于
从V0到T中任何顶点的最短路径长度 (2)每个顶点对应一个距离值
• 关键路径
– 问题提出
把工程计划表示为有向图,用顶点表示事件,弧表示活动; 每个事件表示在它之前的活动已完成,在它之后的活动可 以开始
例 设一个工程有11项活动,9个事件 事件 V1——表示整个工程开始 事件V9——表示整个工程结束 问题:(1)完成整项工程至少需要多少时间?
数据结构第19讲关键路径与最短路径

数据结构第19讲关键路径与最短路径关键路径与最短路径是数据结构中非常重要的概念和算法。
它们在许多领域中都有广泛的应用,包括项目管理、网络通信、物流运输等等。
本文将介绍关键路径和最短路径的概念、算法以及它们的应用。
一、关键路径关键路径是指在一个项目中,所有活动中最长的路径,也即完成整个项目所需的最长时间。
关键路径的长度决定了项目的最短完成时间,因此对于项目管理非常重要。
关键路径的计算通常使用网络图来表示项目的各个活动以及它们的前后关系。
在网络图中,每个活动用一个节点表示,活动之间的关系用边来表示。
活动之间的关系可以分为两种:顺序关系和并行关系。
1.顺序关系:活动A必须在活动B之前完成,这种关系用有向边表示。
2.并行关系:活动A和活动B可以同时进行,这种关系用无向边表示。
关键路径算法通过在网络图上进行正向遍历和逆向遍历来计算关键路径。
具体步骤如下:1.正向遍历:从起始节点出发,计算每个节点的最早开始时间。
最早开始时间是指在没有任何延迟的情况下,从起始节点到达该节点所需的最短时间。
2.逆向遍历:从终点节点出发,计算每个节点的最晚开始时间。
最晚开始时间是指在不延误整个项目完成时间的情况下,从终点节点回到该节点所需的最短时间。
3.计算关键路径:根据每个节点的最早开始时间和最晚开始时间,找出那些最早开始时间和最晚开始时间相等的节点,这些节点就是关键路径上的节点。
关键路径的计算可以有效地帮助项目管理者确定项目的最短完成时间,并将各个活动按照优先级进行排序和调度,从而提高项目的管理效率。
二、最短路径最短路径是指在一个加权图中,从起点到终点所经过的边的权值之和最小的路径。
最短路径算法有很多种,下面介绍两种常用的最短路径算法:迪杰斯特拉算法和弗洛伊德算法。
1.迪杰斯特拉算法:迪杰斯特拉算法是一种贪心算法,用于解决单源最短路径问题。
具体步骤如下:-创建两个集合S和V-S,分别用于存放已确定最短路径的节点和待确定最短路径的节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘 要: 数据结构是计算机学科的算法理论基础和软件设计的技术基础, 在计算机领
域中有着举足轻重的作用。利用邻接矩阵表的存储结构, 实现了在计算机上求关键路
径的算法, 并分析了所设计算法的时间复杂度。
关键词: 数据结构; 关键路径; 算法
中图分类号: TP274
文献标识码: A
数据结构主要研究数据之间的逻辑关系, 算法与数据结构的关系 密切。N·Wirth 教授提出了一个著名公式: 算 法+数 据 结 构=程 序 , 此 公 式 说明一个程序是由两部分组成, 一部分是关于数据结构的描述, 包括数 据的逻辑结构和物理结构, 另一部分是关于算法的描述。在计算机领域, 算法实质上是针对所处理问题的需求在数据结构的基础上实施的某一 运 算 。由 于 数 据 结 构 的 逻 辑 结 构 和 存 储 结 构 不 唯 一 , 因 此 处 理 同 一 个 问 题 的 算 法 也 随 结 构 的 不 同 而 不 同 。在 实 际 的 生 活 中 我 们 常 用 一 个 有 向 的 无回路的网络图来描述一项工程或系统的进行过程, 几乎所有的工程可 分 为 若 干 称 为 活 动 的 子 工 程 。在 这 些 子 工 程 之 间 , 通 常 有 一 定 的 次 序 关 系, 如某些子工程必须在另一些子工程完成之后才能开始, 对于整个工 程来说, 人们最关心是该项工程是否能顺利进行和完成整个工程所需的 最 短 时 间( 关 键 路 径) 。现 在 本 文 就 采 用 邻 接 表 的 存 储 结 构 , 求 出 整 个 工 程完成所需的最短时间。
表 1 探区内各煤层深度及厚度 ( m)
煤层编号
煤层厚度
煤层埋深
4#
0.58
40.99
7#
1.2
83.19
8#
1.4
94.59
11#
4.55
145.74
12#
0.85
170.09
14#
1.2
193.89
测区东侧为同家梁矿东部 盘 区 , 7#, 8#, 11# 三 层 采 空 , 开 采 深 度 为 48
K=p- >adjvex; dut=*( p- >info) ; ∥dut<j, k> If( v[i k] - dut<v[l j] ) v[l j] =v[l k] - dut; } //for
科技情报开发与经济
SCI- TECH INFORMATION DEVELOPMENT & ECONOMY
for( p=G.vertices[ j] ;p;p=p- >nextarc){
变。由此可见, 关键活动的速度提高是有限度的。只有在不改变网的关键
k=p- >adjvex; dut=*( p- >info) ;
K=p- >adjvex; //对 j 号顶点的每个邻接点的入度减 1 If( - - indegree[ k] ==0) push( S, k) ; //若入度减为 0, 则入栈 If( ve[ j] +*( p- >info) >ve[ k] ) ve[ k] =ve[ j] +*( p- >info) ; } //for *( p- >info) =du(t <j, k>) } //wjile if( count<G.vexnum) return ERROR; //该有向网络有回路 else return OK; } //Topologicalorder 在以上算法基础上输出有向网络 G 各项关键活动。 Status Criticalpath( ALGraphG) { //G 为有向网, 输出 G 的各项关键活动。 If( !Topologicalorder( G, T) ) trturn ERROR; V1[ 0..G.vexnum- 1] =ve[ 0..g.vexnum- 1] ;//初 始 化 顶 点 事 件 的 最 迟 发 生时间 While( !StackEmpty( T) ) //按拓扑逆序求各项点的 v1 值 For( Pop( T, j) , p=G.vertices[ j] .firstarc; p; p=p- >nextarc) {
m~123 m, 累计采厚为 5.5 m, 采深比为 4.5%。7# 层 1957—1962 年开采,
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for( j=0;j<G.vexnum;++j) //求 ee, el 和关键活动
亦是多方面的, 任何一项活动持续时间的改变都会影响关键路径的改
本 区 属 典 型 的 大 陆 性 气 候 、半 干 旱 地 区 , 降 水 量 450 mm/a , 蒸 发 量 1 800 mm/a, 年平均气温 5.5 ℃, 最高 34.5 ℃, 最低- 29 ℃, 冻 土 层 深 度 1.5 m 左右。
测区内无特殊地质构造, 探测线区域对应下覆各煤层深度及厚度见 表 1。
1 地质概况
同家梁井田位于大同煤田东部, 口泉河中下游, 地跨大同市南郊。沿 口泉河有至西部王村矿的矿区公路、铁路通过, 探测区有简易公路, 交通 较 为 便 利 。测 区 位 于 同 家 梁 矿 所 在 的 口 泉 河 及 居 民 住 宅 、公 路 、铁 路 保 护 煤柱内, 其四周均已采空。测区为冲洪积地貌, 地表被砂卵石和黄土所覆 盖, 冻土层较厚, 地势较为平坦。
2007 年 第 17 卷 第 8 期
文章编号: 1005- 6033( 2007) 08- 0167- 03
收稿日期: 2006- 10- 31
物探方法在采煤沉陷探测中的应用
周建国 1, 2
( 1.中国矿业大学, 江苏徐州, 221008; 2.大同煤矿集团公司地质处, 山西大同, 037003)
166
其中, S 是所有以第 i 关键路径的重点是找到某个活动的最早开始 时 间 e( i) 和 最 迟 开 始 时 间 (l i) , 而 e( i) 和 (l i) 又 与 事 件 的 最 早 发 生 时 间 ve( j) 和 最 迟 发 生 时 间 v(l j) 有 关 。虽 然 我 们 给 出 了 两 个 递 推 公 式 来 求 ve ( j) 和 v(l j) , 但计算必须分别在 拓 扑 有 序 的 前 提 下 进 行 。也 就 是 说 , ve( j- 1) 必 须 在 vj 的 所 有 前 驱 的 最 早 发 生 时 间 求 得 之 后 才 能 确 定 。因 此 , 可 以 在拓扑排序的基础上计算 ve( j- 1) 和 v(l j- 1) 。
1 关键路径的算法思想
我们用有向网络来表示某一工程, 用有向网络的弧来表示某个子工 程( 活 动) , 顶 点 表 示 某 个 事 件 , 弧 上 的 权 来 表 示 子 工 程 或( 活 动) 持 续 的 时间, 这样的有向网络称为 AOE( Activity On Edge) 一网。
由 于 整 个 工 程 只 有 一 个 开 始 点 和 一 个 完 成 点 , 故 在 正 常 情 况( 无 回 路) 下, 网中只有一个入度为零的点( 对称源点) 和一个出度为零的点( 汇 点) 。由 于 AOE 一 网 中 有 一 些 活 动 可 以 并 行 地 进 行 , 所 以 完 成 工 程 的 最 短时间是从开始点到完成点的最长路径的长度( 这里所说的路径长度是 指路径上各活动持续时间之和, 不是路径上弧的数目) 。路径长度最长的 路 径 叫 做 关 键 路 径 , 假 定 开 始 点 是 V1, 从 V1 到 Vi 的 最 长 路 径 长 度 叫 做 事件 Vi 的最早发生时间。这个时间决定了所有以 Vi 为尾的弧表示的活 动 的 最 早 开 始 时 间 , 我 们 用 e( i) 表 示 活 动 ai 的 最 早 开 始 时 间 , 还 可 以 定 义一个活动的最迟开始时间 (l i) , 这是在不推迟整个工程完成的前提下, 活动 ai 最迟必 须 开 始 进 行 的 时 间 。两 者 之 差 (l i) - e( i) 意 味 着 完 成 活 动 ai 的 时 间 余 量 , 我 们 把 (l i) = e( i) 的 活 动 叫 做 关 键 活 动 。显 然 , 关 键 路 径 上所有活动都是关键活动。
科技情报开发与经济
SCI- TECH INFORMATION DEVELOPMENT & ECONOMY
2007 年 第 17 卷 第 8 期
文章编号: 1005- 6033( 2007) 08- 0166- 02
收稿日期: 2006- 11- 01
基于数据结构的关键路径算法
赵小会
( 晋城职业技术学院图书馆, 山西晋城, 048026)
下面先给出求各顶点事件的最早发生时间 ve( 全局变量) 。
3 算法( 有向网 G 采用邻接表存储结构)
status topologicalorder( ALGraph G, Stack &T){ //有向网 G 采用邻接表存储结构, 求各 顶 点 事 件 的 最 早 发 生 时 间 ve ( 全局变量) 。 //T 为拓扑序列顶点栈, S 为零入度顶点栈。 //若 无 G 回 路 , 则 用 栈 T 返 回 G 的 一 个 拓 扑 序 列 , 且 函 数 值 为 OK, 否则为 ERROR。 FindInDegree( G, indegree) ;//对各顶点求入度 indegree[ 0..vernum- 1] 建零入度顶点栈 S; InitStack( T) ; count=0; ve[ 0..g.vexnum- 1] =0;//初始化 While( !StackEmpty( S) ) Pop( s, j) ; push( T, j) ; ++count; //j 号顶点入 T 栈并计数 For( p=G.vertices[ j] .firstarc; p; p=p- >nextarc){
只要求得 AOE 一网中活动的 e( i) 和 (l i) , 就能够知道该项活动是否 为关键活动。首先求得事件最早发生时间 ve( j) 和最迟发生时间 v(l j) 。如 果活动 ai 由弧<j, k>表示, 其持续时间记为 du(t <j, k>) , 则有如下关系: