《关键路径》实验报告
关键路径问题报告
![关键路径问题报告](https://img.taocdn.com/s3/m/05e9644ae518964bcf847c17.png)
滁州学院课程设计报告课程名称:数据结构设计题目:关键路径问题院部:计算机与信息工程专业:网络工程组别:第六组起止日期:2012年4月9日~2012年6月24日指导教师:赵玉艳计算机与信息工程学院二○一二年制课程设计题目关键路径问题组长柯焱芳学号2011211384 班级网工113班院部计算机工程系专业网络工程组员靳梦婷李鹏飞陆勇刘宜雨指导教师赵玉艳课程设计目的1.巩固和加深学生对数据结构课程基本知识的理解,综合该课程中所学的理论知识,独立或联合完成一个数据结构应用课题的设计;2.根据选题需要,通过查阅手册和文献资料,培养分析和解决实际问题的能力;3.熟练掌握图的各种基本数据结构的定义、存储结构和相应的算法,并可熟练利用c语言进行实现;4.具有一定的算法设计和分析能力,掌握选用合适的数据结构解决实际问题的方法;5.学会撰写课程设计报告,能做出简单答辩;6.培养严肃认真的工作作风和严谨求实的科学态度。
课程设计所需环境⑴实验设备:PC机⑵操作系统:Windows XP ⑶开发环境:VisioC++6.0课程设计任务要求要求学生理解图的特征和性质,掌握各类图的存储结构、相关操作的程序实现以及图的应用,能够利用图的遍历、图的最小生成树、最短路径、关键路径、拓扑排序等原理解决实际问题。
课程设计工作进度计划序号起止日期工作内容分工情况1 4.09-4.16 选题与分析课题内容,查找资料柯焱芳:选题与分析课题内容陆勇靳梦婷李鹏飞刘宜雨:查找资料2 4.17-4.25 编写创建图,求最大路径的函数刘宜雨靳梦婷:创建图李鹏飞陆勇:求最大路径34.26-5.16 编写总代码和主函数(求关键路径)柯焱芳:编写总代码和主函数(求关键路径)4 5.17-5.25 对程序输入改写柯焱芳靳梦婷:对程序输入改写5 5.26-6.10 对程序进行测试柯焱芳靳梦婷刘宜雨陆勇李鹏飞6 6.11-6.24 整理文档与总结柯焱芳陆勇指导教师签字:年月日院(系)审核意见院长(主任)签字:年月日目录1 引言 (1)2 需求分析 (1)2.1问题描述 (1)2.2基本要求 (1)2.3目的 (2)3 概要设计 (2)3.1数据类型 (2)3.2 程序流程图 (2)4 详细设计 (3)4.1文件输入 (3)4.2创建图的函数 (3)4.3求关键路径 (4)5 关键路径测试 (7)6 课程设计总结与体会 (10)参考文献 (11)附录 (12)致谢 (17)当一项工程划分为若干个子任务或活动后,人们不仅需要确定这些活动的先后次序,而且需要进一步计算完成整个工程的时间,确定哪些活动是影响工程进度的关键活动,以便合理地组织人力、物力、财力,加快这些活动的进度,为按时或提前完成整个工程提供保证,这就是关键路径问题。
求关键路径设计报告 数据结构课程设计毕业设计(论文)word格式
![求关键路径设计报告 数据结构课程设计毕业设计(论文)word格式](https://img.taocdn.com/s3/m/da222db66c85ec3a87c2c5ca.png)
数据结构课程设计题目:关键路径的设计报告科系:计算机科学与技术班级:姓名:题目:1、编写拓扑排序和求关键路径的程序2、单源顶点最短路径问题设计报告一.需求分析1.在实际工程中拓扑排序和求关键路径是经常使用来安排任务的先后顺序,以及找出关键的路径,合理的安排非关键任务的施工顺序。
2.对用邻接矩阵表示的有向图,从某一顶点出发(称为源点)到该图其它各顶点(称为终点)有无路径?最短路径是什么?路径长为多少?问题要求写一个程序从有向网中的某一顶点出发找出该顶点到其余各顶点的最短路径。
对邻接矩阵cost[n][n]中的每一个元素只能有三种情况:①当i=j时,cost[i][j]=0;②当顶点i和j无边时,cost[i][j]=∞;③当顶点i和j有边,且其权值为W ij时,cost[i][j]=W ij。
由于题目中没有规定输出格式,此程序以顶点序号的形式将最短路径输出到终端上去,并输出该最短路径的长度。
二.概要设计1.1抽象数据类型图的定义如下:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集.数据对象I:I是具有相同特性的数据元素的集合,称为顶点集.数据关系R:R={VR}VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在路径}基本操作P:Creat_ALGraph(&G,V,VR,I)初始条件:V是图的顶点集,VR是图中边的集合,I是边的权值。
操作结果:按V和VR的定义构造图G。
DFS(&G, v)初始条件:v是图的一个顶点,图G存在。
操作结果:从v点深度优先遍历图G。
DFSTraverse(&G)初始条件:图G存在。
操作结果:深度优先遍历图G。
FindIngree( G,b[])初始条件:图G存在,数组b[]已知。
操作结果:图G的每个顶点的度放在数组b中。
TopologicalSort(&G)初始条件:图G存在。
操作结果:对图G进行拓扑排序。
关键路线法实验报告(3篇)
![关键路线法实验报告(3篇)](https://img.taocdn.com/s3/m/4ca99e7753d380eb6294dd88d0d233d4b04e3f78.png)
第1篇一、实验目的通过本次实验,掌握关键路线法(Critical Path Method,CPM)的基本原理和操作步骤,学会运用CPM方法进行项目进度计划和控制,提高项目管理水平。
二、实验背景关键路线法是一种用于项目进度计划和控制的方法,通过分析项目网络图中各活动的逻辑关系和持续时间,确定关键路线,从而预测项目工期,并对项目进度进行有效控制。
三、实验内容1. 项目网络图的绘制- 以某建筑工程项目为例,绘制项目网络图,标明各活动之间的逻辑关系和持续时间。
- 确定项目起点和终点,以及各活动的紧前活动和紧后活动。
2. 计算各活动的最早开始时间(ES)和最早结束时间(EF)- 从项目起点开始,按顺序计算各活动的最早开始时间和最早结束时间。
3. 计算各活动的最迟开始时间(LS)和最迟结束时间(LF)- 从项目终点开始,逆序计算各活动的最迟开始时间和最迟结束时间。
4. 计算各活动的总时差(TS)- 总时差 = 最迟开始时间 - 最早开始时间或最迟结束时间 - 最早结束时间。
5. 确定关键路线- 找出总时差为0的活动,这些活动组成关键路线。
6. 绘制关键路线图- 将关键路线在项目网络图中标注出来,以便直观地展示关键路线。
四、实验步骤1. 项目网络图的绘制- 使用Microsoft Visio或其他绘图软件,绘制项目网络图。
- 确定项目起点和终点,以及各活动的紧前活动和紧后活动。
2. 计算各活动的最早开始时间和最早结束时间- 从项目起点开始,按顺序计算各活动的最早开始时间和最早结束时间。
3. 计算各活动的最迟开始时间和最迟结束时间- 从项目终点开始,逆序计算各活动的最迟开始时间和最迟结束时间。
4. 计算各活动的总时差- 计算总时差 = 最迟开始时间 - 最早开始时间或最迟结束时间 - 最早结束时间。
5. 确定关键路线- 找出总时差为0的活动,这些活动组成关键路线。
6. 绘制关键路线图- 将关键路线在项目网络图中标注出来,以便直观地展示关键路线。
网络图和关键路径
![网络图和关键路径](https://img.taocdn.com/s3/m/4651c4203169a4517723a31f.png)
宁波大红鹰学院实验报告
实验名称:网络计划应用(一)
学院:信息工程专业:信息管理与信息系统年级:11级
问题2:已知某项目的各工序关系和时间如下表所示:
工序
紧前工序
工序时间(d)
工序
紧前工序
工序时间(d)
工序
紧前工序
工序时间(d)
a
g,m
3
e
c
5
i
a,l
2
b
h
4
f
a,e
5
k
f,i
1
c
-
7
g
b,c
2
l
b,c
7
d
l
3
h
-
5
m
c
3
若要求工程完工时间缩短2 d(天) ,缩短哪些工序时间为宜。
三、问题的数学模型及求解结果解释
小组成员1:学号:职责:
小组成员2:学号:职责:
小组成员3:学号:职责:
实验时间:年月日实验类型:
实验地点:成绩:指导教师签字:
实验报告基本内容要求:一、实验目的和要求;二、实验内容和原理;三、主要仪器设备;四、操作方法与实验步骤;五、实验数据记录和处理;六、实验结果与分析;七、讨论、心得
一、实验目的和要求
1、掌握项目的进度箭线图的绘制方法
2、学会利用Excel工具计算项目各工序网络时间和寻找项目关键工序的方法
要求:在实验报告中建立问题的数学模型并用Excel求解模型,完成后将实验报告和Excel文件提交
关键路径(criticalpath)
![关键路径(criticalpath)](https://img.taocdn.com/s3/m/7fcf4e96fc0a79563c1ec5da50e2524de518d06b.png)
关键路径(criticalpath)关键路径是项目管理中进度控制的一个术语。
在项目的网络图中,从项目开始到项目完成有许多条路径可以走,就像从798艺术区到北京大学一样。
如果20个人同时从798艺术区出发,每个人走不同的路(乘坐地铁、公交车或是自驾),但只有20个人全部到达北京大学,才能完成聚会。
这最后一个到达的人就是走最长路径(花费时间最多)的人。
相似的,只有最长(花费时间最多)的路径完成之后,项目才算结束。
这条在整个网络图中最长的路径就叫关键路径(critical path)。
上面先给大家一个关键路径的总体概念,下面我们来了解关键几个术语:(1) 最早开始时间(ES)指某项活动最早能够开始的时间(2) 最早结束时间 (EF) 指某项活动最早能够完成的时间EF=ES+工期估计EF是根据ES和工期估计,正向推算推算获得的。
(3) 最迟结束时间(LF) 指为了某项活动能够在要求的时间节点完成,最迟必须完成的的时间(4) 最迟开始时间 (LS) 指为了某项活动能够在要求的时间节点完成,最迟必须开始的时间LS=LF-工期估计LS是根据LF和工期估计,反向推算获得的。
(5)总时差(TS):项目EF和项目要求完成时间的差值,也成为浮动量(float)总时差=LF-EF 或总是差= LS-ES,两种计算方法得到的结果是相等的。
好,我们回来接着说关键路径,确定构成关键路径的一种方法是找出那些具有最小时差值的活动。
用每项活动的LF-EF( 或LS-ES,结果一样),然后找出最小值(要么是正时差最小,要么是负时差最大)的活动,则这些活动都是关键路径上的活动。
图2其中,将时差累加,获得红线的时差最小,所以上图黄色线路为此项目的关键路径(如图2)。
同时,任务D和任务E并行,任务D的时差为7天,而任务E的时差为8天,所以任务D有一天的浮动时间(如图3)。
图3值得说明的是,如果项目很大,一个项目网络图从开始到结束会有很多条路径,一些路径可以总是正时差,另一些可能有负时差。
关键路径实验报告
![关键路径实验报告](https://img.taocdn.com/s3/m/e9cf8cde5022aaea998f0f84.png)
}
cout<<"关键路径为:"<<endl;
for(j = 0;j<algraph.vexnum;j++)
//求ee el和关键活动(同上)
{
for(p = algraph.vertices[j].firstarc;p;p = p->nextarc)
{
k = p->adjvex;
dut = *(p->info);
2、算法设计
源程序:
template <class T>
bool ALGraph<T>::TopologicalOrder(SeqStack<int> &t)
//求各顶点事件的最早发生时间ve
{
int j,k,count,indegree[MAX_VERTEX_NUM];
SeqStack<int> s;
count = 0;
for(j = 0;j<algraph.vexnum;j++)
{
ve[j] = 0;
}
while(!s.IsEmpty())
//S非空
{
s.Pop(j);
t.Push(j); count++; //j号顶点入T栈并计数
for(p = algraph.vertices[j].firstarc;p;p = p->nextarc)
1)画出运行程序中的图。
aቤተ መጻሕፍቲ ባይዱ
b
c
1 1d
e2
2)分析辅助变量的值。
答:j k dut ee e1 tag
《关键路径》实验报告
![《关键路径》实验报告](https://img.taocdn.com/s3/m/9235cfed51e79b89680226b2.png)
在的边。
概
主函数:main()
建图函数:CreateGraph ()
要
求解关键路径函数:CriticalPath ()
设
计
int Criticalpath(ALGraph G){ /* G 为有向网,输出 G 的各项关键活动。*/
InitStack(T); /*建立用于产生拓扑逆序的栈 T*/ if (! TopologicalOrder (G,T) )
中中 T中中中中
j中中中中中中中
从 Vl(n)=Ve(n)开始向后递推
Vl(i) Min{Vl( j) dut( i, j )}, i, j S,1 i n 1 j
中中 S中中中中
i中中中中中中中
程序功能:根据输入的图的信息,能够建立 AOE-网,并能够输出关键路径所
e = ve [j]; l = vl [k] - dut;
tag = (e= =l) ? ‘*’:’’ ;
printf ( j,k,dut,e,l,tag ); /*输出关键活动*/ }
return 1; /*求出关键活动后返回 1*/ } /*Criticalpath*/
测试用例 1:如下图(顶点数和边数:9,11)
需
关键活动——关键路径上的活动,即 l(i)=e(i)的活动
求
设活动 ai 用弧<j,k>表示,其持续时间记为:dut(<j,k>)。则有:
e(i)=Ve(j)
描
l(i)=Vl(k)-dut(<j,k>)
如何求 Ve(j)和 Vl(j)?
述
从 Ve(1)=0 开始向前递推
Ve( j) Max{Ve(i) dut( i, j )}, i, j T ,2 j n i
关键路径问题数据结构课程设计
![关键路径问题数据结构课程设计](https://img.taocdn.com/s3/m/a75d418164ce0508763231126edb6f1aff00710b.png)
关键路径问题数据结构课程设计一、引言二、关键路径问题概述1.定义2.应用场景三、关键路径问题算法分析1.活动网络图的表示方法2.计算活动最早开始时间和最晚开始时间3.计算活动最早结束时间和最晚结束时间4.确定关键路径及其长度四、数据结构设计与实现1.数据结构选择与设计思路2.程序实现流程图及详细说明五、测试与分析结果展示六、总结与展望一、引言在项目管理中,关键路径问题是一个重要的问题,它可以帮助我们确定项目完成所需的最短时间,并且能够帮助我们找到项目中的瓶颈点。
本文将介绍关键路径问题的概念和算法分析,并以数据结构课程设计为背景,详细阐述数据结构设计与实现。
二、关键路径问题概述1.定义关键路径指的是项目中最长的一条连续活动序列,这些活动之间没有任何浮动时间,也就是说如果这些活动出现了延误,整个项目都会受到影响。
因此,在项目管理中,我们需要找到这条关键路径,并尽可能地缩短它的长度。
2.应用场景关键路径问题在项目管理中有广泛的应用,例如建筑工程、软件开发等。
在建筑工程中,我们需要确定每个活动的时间和优先级,以便确定项目完成所需的最短时间。
在软件开发中,我们需要确定每个模块的依赖关系和优先级,以便确定项目完成所需的最短时间。
三、关键路径问题算法分析1.活动网络图的表示方法活动网络图是一种图形化表示方法,它可以帮助我们清晰地了解整个项目中各项任务之间的依赖关系。
在活动网络图中,每个任务都表示为一个节点,并且每个任务之间都有一条边表示它们之间的依赖关系。
2.计算活动最早开始时间和最晚开始时间在计算关键路径时,我们需要计算每个活动的最早开始时间和最晚开始时间。
最早开始时间指的是该活动可以开始执行的最早时间,而最晚开始时间指的是该活动必须开始执行的最晚时间。
3.计算活动最早结束时间和最晚结束时间与计算开始时间类似,在计算关键路径时,我们还需要计算每个活动的最早结束时间和最晚结束时间。
最早结束时间指的是该活动可以完成执行的最早时间,而最晚结束时间指的是该活动必须完成执行的最晚时间。
项目关键路径分析总结
![项目关键路径分析总结](https://img.taocdn.com/s3/m/14e4ffeb370cba1aa8114431b90d6c85ec3a8885.png)
项目关键路径分析总结在项目管理中,关键路径分析是一种重要的工具,用于确定项目的关键活动和路径,以及项目完成所需的最短时间。
通过对项目各个活动的时间、依赖关系和资源约束进行分析,可以帮助项目经理有效地进行进度计划和资源分配。
本文将总结项目关键路径分析的基本原理和步骤,并探讨其在实际项目中的应用。
1. 关键路径分析的基本原理关键路径分析是通过构建项目网络图来确定关键活动和关键路径。
项目网络图由活动节点和箭头连接组成,箭头表示活动之间的依赖关系,节点表示活动的开始和结束时间点。
在项目网络图中,关键活动是指其总时长最长的路径上的活动,关键路径是指由关键活动组成的路径。
关键路径上的活动不能延误,否则将会对整个项目的进度产生重大影响。
2. 进行关键路径分析的步骤2.1 收集项目相关信息:包括活动清单、各活动之间的依赖关系、活动所需的时间、资源约束等。
2.2 绘制项目网络图:将项目的活动和依赖关系用节点和箭头表示,并标明活动所需时间。
2.3 确定各活动的最早开始时间(EST)和最晚开始时间(LST):从项目的起始节点开始,根据依赖关系计算各活动的最早开始时间和最晚开始时间。
2.4 确定各活动的最早完成时间(EFT)和最晚完成时间(LFT):根据活动所需时间和最早/晚开始时间计算各活动的最早完成时间和最晚完成时间。
2.5 计算各活动的总时差(TF):总时差即最晚开始时间减去最早开始时间,表示活动可以延误的时间。
2.6 确定关键路径:根据最早完成时间和最晚完成时间,找出活动总时差为0的路径,即为关键路径。
3. 关键路径分析的应用3.1 进度控制:通过关键路径分析,项目经理可以清楚地知道项目关键活动和关键路径,并根据其完成时间进行进度控制和调整。
3.2 资源分配:关键路径分析可以帮助项目经理确定哪些活动在项目中是最关键的,从而合理分配资源,保证项目的顺利进行。
3.3 风险管理:关键路径分析可以帮助项目经理识别项目中的潜在风险点,从而及时采取措施降低风险的影响。
数据结构课程设计报告---关键路径
![数据结构课程设计报告---关键路径](https://img.taocdn.com/s3/m/ee247c727e21af45b307a878.png)
数据结构课程设计Array报告院系:信息管理学院专业:软件工程目录一、问题的描述二、系统需求及分析1、简要介绍2、需求分析3、概要设计4、详细设计(1)数据结构(2)创建有向图的邻接表(3)计算各事件及活动的相关信息(4)输出有向图的相关信息(5)判断图中是否有回路(6)计算并输出关键活动(7)计算并输出关键路径(8)操作入口三、系统实现四、设计总结五、附件(完整源代码)一、问题的描述:关键路径问题(起评分:85)1、功能:设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。
2、数据:自行设计每个活动的前导活动和后续活动以及活动的进行时间,然后依据这些活动的前后次序,画出其网络图,选择存储结构。
3、操作:(1)求工程最短工期;(2)输出关键路径;(3)输出关键活动。
4、要求:界面友好,提示信息完整。
二、系统需求及分析:1、简要介绍:我们通常把计划、施工过程、生产流程、程序流程等都当成一个工程。
工程通常分为若干个称为“活动”的子工程。
完成了这些“活动”,这个工程就可以完成了。
我们通常用AOE-网来表示工程。
AOE-网是一个带权的有向无环图,其中,顶点表示事件(EVENT),弧表示活动,权表示活动持续的时间。
AOE-网可以用来估算工程的完成时间。
他可以使人们了解:(1). 研究某个工程至少需要多少时间?(2). 哪些活动是影响工程进度的关键?由于AOE-网中的有些活动可以并行进行,从开始点到各个顶点,以致从开始点到完成点的有向路径可能不止一条,这些路径的长度也可能不同。
完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。
因此,完成工程所需的最短时间是从开始点到完成点的最长路径的长度,即在这条路径上的所有活动的持续时间之和.这条路径长度就叫做关键路径(Critical Path)。
关键路径可以很方便的让我们估算出某个工程最短的时间开销,以及这个工程中哪些活动,即哪些项目是主要的,是影响工程进度的关键,从而让我们对工程的实施做出更好的时间安排,并且可以分清主次,抓住核心工程,做到有的放矢。
关键路径问题的解决方法心得和体会和感悟
![关键路径问题的解决方法心得和体会和感悟](https://img.taocdn.com/s3/m/8b25200032687e21af45b307e87101f69e31fbe3.png)
关键路径问题的解决方法一、关键路径问题的定义关键路径是指在项目管理中,指的是在不影响整个项目完成时间的前提下,完成某项任务所需要的最短时间路径。
也就是说,如果这条路径上的任何一个任务出现了延误,都会直接导致整个项目的延误。
解决关键路径问题对于项目的整体进度控制至关重要。
二、关键路径问题的常见原因1.资源不足:在项目进行中,可能会出现人力、物力、财力等资源不足的情况,导致关键任务的完成时间延误。
2.任务依赖关系复杂:项目中的任务之间存在复杂的依赖关系,一旦出现环节延误,就会影响整个项目的进度。
3.管理不当:项目管理过程中,可能存在交流不畅、决策不及时等管理不当的情况,导致关键任务无法按时完成。
4.外部环境因素:外部环境的改变,比如市场需求、政策法规等因素的变化,可能会对项目的进度产生影响。
三、解决关键路径问题的方法1.资源优化:对资源进行合理规划和分配,确保在关键任务完成时有足够的人力、物力、财力支持。
2.任务分解:将复杂的任务进行细化分解,明确每个子任务的完成时间和依赖关系,有利于更精准地控制关键路径上的任务。
3.缓冲路径计划:在关键路径之外,预留一定的时间作为缓冲,以防止非关键任务的延误对整个项目产生影响。
4.增加交叉培训:对项目团队成员进行交叉培训,增强团队的协作能力和应对突发情况的能力,提高应对关键路径问题的灵活性。
5.利用项目管理工具:借助项目管理软件,实时监控关键路径上任务的进度,及时发现问题并进行调整。
四、关键路径问题的解决方法的体会和感悟在项目管理中,关键路径问题是一个比较棘手的问题,但通过对问题的深入分析和合理的应对措施,可以有效解决关键路径问题,提高项目的整体进度控制能力。
在实际工作中,我们需要密切关注项目进度的情况,及时发现关键路径上可能存在的问题,从而采取针对性的措施进行解决。
作为项目负责人,更需要对团队的资源规划和任务分解进行详细的考量和分析,确保项目整体进度的可控性。
在不断的实践中,我们可以积累丰富的解决关键路径问题的经验,为今后的项目管理工作提供可靠的支持和保障。
数据结构课程设计报告 关键路径的实现
![数据结构课程设计报告 关键路径的实现](https://img.taocdn.com/s3/m/9fa53bcb1ed9ad51f11df244.png)
青岛理工大学数据结构课程设计报告题目:关键路径的实现院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 2014.7.8—2014.7.19指导教师: 张艳一、需求分析1.问题描述找出实际工程中的关键路径,合理安排关键活动的施工顺序。
要求:(1)表示工程的图可以用邻接表或邻接矩阵存储;(2)应能以图形的方式输出图;(3)输出关键路径和关键活动。
2.基本功能(1)用邻接表存储有向图并建立AOE网 CreateGraph();(2)用图形的形式输出有向图Display();(3)输出关键路径和关键活动 SearchMapPath();3.输入输出输入: (1)有向图的顶点数和弧数,都是int型,中间用空格隔开;(2)图中的各个顶点的值,char型;(3)图中弧的权值、起点、终点,都是int型,中间用空格隔开;输出:起点(char)、终点(char) 、最早开始时间(int)、最迟开始时间(int)、差值(int)、是否为关键活动、关键路径。
二、概要设计1.设计思路:(1) 输入图的顶点数和弧数。
(2) 输入这个图中每段弧的起始点及权值。
(3) 用输入的数据建立AOE网。
(4) 用邻接表来存储图的这些信息。
(5) 用CreateGraph( )函数建立AOE图。
(6)用Display()函数输出AOE图。
(7) 用SearchMapPath ( )函数求出最长路径,并输出关键路径。
(8) 编写程序。
2.数据结构设计:(1)逻辑结构采用图状的结构。
图是一种较线性表和树更为复杂的数据结构。
在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关;而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。
《关键路径法》课件
![《关键路径法》课件](https://img.taocdn.com/s3/m/82f8048d2dc58bd63186bceb19e8b8f67c1cef88.png)
沟通问题
在大型项目中,不同部门之间的沟 通协调可能存在障碍,影响关键路 径法的实施效果。
数据准确性
关键路径法的实施需要大量数据支 持,如果数据不准确或不完整,会 影响分析结果的可靠性。
如何克服局限性
01
培训与提升
加强项目团队成员的技能培训 ,提高团队整体能力,确保关
键路径法的有效实施。
关键路径法的未来展望
持续优化
绿色可持续发展
随着项目管理理论的不断完善和实践 经验的不断积累,关键路径法将不断 得到优化,提高项目管理的效率和准 确性。
在可持续发展理念日益受到重视的背 景下,关键路径法将更加注重绿色可 持续发展,引导项目实现环保、经济 和社会效益的有机统一。
集成化管理
未来项目管理将更加注重集成化管理 ,关键路径法将与其他项目管理工具 和方法集成,形成更加完善和高效的 项目管理体系。
《关键路径法》ppt课件
目录
• 关键路径法简介 • 关键路径法的实施步骤 • 关键路径法的优势与局限性 • 关键路径法的案例分析 • 关键路径法的发展趋势与展望 • 总结与建议
01
关键路径法简介
定义与特点
02
定义
特点
关键路径法是一种项目管理方法,通过识别项目中关键活动和顺序, 优化项目进度计划,确保项目按时完成。
资源优化
关键路径法能够合理分配资源,避免资 源浪费,降低项目成本。
风险管理
关键路径法有助于发现项目中的潜在风 险,提前制定应对措施,降低风险对项 目的影响。
局限性
依赖性
关键路径法的实施效果依赖于项目 团队成员的技能和经验,如果团队 成员能力不足,可能会影响分析结
果的准确性。
C 实现关键路径算法课程设计报告
![C 实现关键路径算法课程设计报告](https://img.taocdn.com/s3/m/4e826b140b4c2e3f572763c5.png)
有向图的关键路径计算机与软件工程学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码:题目:年级/专业/班:学生姓名:学号:开始时间:2016 年 5 月8 日完成时间:2016 年5月18 日课程设计成绩:指导教师签名:年月日目录引言 (1)1需求分析 (1)1.1任务与分析 (1)1.2测试数据 (1)2 概要设计 (3)2.1设计思路 (3)2.2层次图 (3)3 详细设计 (4)3.1主函数的实现 (4)3.2数据录入实现 (5)3.3输出图的各顶点和弧的实现 (6)3.4计算各顶点的入度 (7)3.5输出关键路径 (8)4调试分析 (8)5用户使用说明 (9)6测试结果 (9)6.1录入数据 (9)6.2功能实现 (10)6.3测试结论 (11)致谢 (13)参考文献 (14)摘要具有最大路径长度的路径称关键路径,关键路径上的活动称关键活动。
课程设计主要要求求有向图的关键路径。
用领接表存储结构储存有向图。
用深度遍历的方式输出有向图的顶点和弧。
程序实现了存储有向图,输出有向图的各顶点和弧,计算顶点的入度和求有向图的关键路径这四个功能。
用领接表存储结构储存有向图,用深度遍历的方式输出有向图的顶点和弧,用遍历查找的方式计算顶点的入度。
求关键路径时先用拓扑排序函数判断有向图是否有回路,调用求关键活动的函数找到关键路径,最后输出。
关键词:领接表;入度;AOE网;关键路径;有向图的关键路径引言工程有很多的阶段,这些阶段之间有一定的先后关系和自己的时间。
我们可以用图来表示工程,将其输入程序中,可以用程序计算出工程的相关信息,如,工程完成的最短时间,哪些活动会影响工程的进度等。
要解决这些问题就可以用领接表储存图,并计算各个事件和各个阶段的最早发生时间和最晚发生时间,得到关键活动,从而的到关键路径。
1需求分析从键盘上输入图的各顶点和弧上的权值,用领接表储存。
在屏幕上输出图的顶点和弧。
计算输出顶点的入度。
关键路径的查找实验报告
![关键路径的查找实验报告](https://img.taocdn.com/s3/m/dd71940bdd36a32d737581fd.png)
中国矿业大学矿业工程学院实验报告课程名称计算机软件设计基础姓名 xxxx 班级采矿10-8班学号 xxxxx 日期 2012年10月成绩教师 xxxx3.2算法步骤:(1)输入e条弧<j,k>,建立AOE网的存储结构。
(2)从源点v1出发,令ve(1)=0,求ve(j),2<=j<=n。
(3)从汇点vn出发,令vl(n)=ve(n),求vl(i) 1<=i<=n-1。
(4)根据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为关键活动。
总结首先,关于程序方面,我发现即使对设计思路有了眉目,知道了所要用到的数据结构、用邻接表来存储AOE-网、建立栈来求拓扑序列、输出的拓扑序列的个数少于节点数则有回路等等,要把这些方法写成函数代码,其实还是一件非常不容易的事情。
再加上要完善设计思路,构造整个程序框架在内,都是一件工作量非常大的工作。
在处理程序代码的时候,有两个问题始终解决不了。
一是程序输入时只能输入整形数据,而非整形的输入则会导致程序异常停止,但是因为整形的输入方式已贯穿整个程序,若要修改只能另外重做整个程序,所以暂不考虑修改,而打算做一个判错系统,判断若非整形的输入则报错;二是第一种错误的解决方案未能成功实行,于网路上搜索到了几种判断是否为整形数据的程序代码,但将其修改融合到求关键路径的程序中,虽然没有错误可以运行,但是却不能正确的报错。
于是,在尝试多种方案却仍不成功的前提下,我只好选择加上提示语,即:printf("请输入某项目的信息,并请用整形数字表示(格式:弧头,弧尾,权值):\n");printf("例如:输入1,2,4 即代表结点1与4之间的活动需要4个时间单位。
\n");这是这次课程设计中最大的两个遗憾。
不过在操作界面的人性化上,我倒尽可能的做得很完善,无论从美观角度还是方便清楚操作,都实行了非常人性化的方式。
数据库关键路径实验报告
![数据库关键路径实验报告](https://img.taocdn.com/s3/m/7bf20f2d2f60ddccda38a0b7.png)
成都信息工程学院计算机系课程实验报告一【上机实验目的】对有向图的拓扑排序和关键路径更加了解以及更好的应用它二【实验环境】PC机每人1台在Visual C++环境下测试三【上机实验内容】.给定一图,在其拓朴排序的基础上,求关键路径,要求以图形界面呈现关键路径。
四【上机调试程序流程图】(注:可打印)五【上机调试中出现的错误信息、错误原因及解决办法】犯的错误1.在写构建图这个子函数时,初始数据的时候有点问题,本来想用文件的,但是对于文件用的不是很熟悉,然后就利用了二维数组来存放数据。
2.就是在画图形界面的时候,让关键路径以另外的颜色出现时候出现了问题。
解决方法是找到个最早时间和最迟时间相等就把顶点和终点赋值给相应的顶点,再进行颜色的改变。
六【上机调试后的源程序及还存在的问题】(注:源程序可打印)#include <graphics.h>#include<iostream>using namespace std;#define MAX_VEXTEX_NUM 20#define M 20#define MaxLen 1000 //最大长度#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define ERROR 0#define OVERFLOW -1typedef int SElemType;typedef int VertexType;typedef int VRType;typedef int InfoType;typedef struct ArcNode{int adjvex; // 该弧所指向的顶点的位置struct ArcNode *nextarc;// 指向下一条弧的指针InfoType info; // 该弧相关信息的指针}ArcNode;typedef struct VNode{VertexType data;// 顶点信息ArcNode *firstarc;// 指向第一条依附该顶点的弧}VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{AdjList vertices;int vexnum, arcnum;}ALGraph;typedef struct SqStack{SElemType *base;SElemType *top;int stacksize;}SqStack;class point //画界面{public:point(int x,int y):m_x(x),m_y(y){}point(){}int x(){return m_x;}int y(){return m_y;}point operator+(point p){return point(m_x+p.x(),m_y+p.y());}point operator/(int i){return point(m_x/i,m_y/i);}private:int m_x;int m_y;};int g_r=25;int g_height=400;int g_width=500;point g_pos[9];void paintmain(ALGraph &G);void line(point a,point b){line(a.x(),a.y(),b.x(),b.y());}void fillcircle(point p,int r){fillellipse(p.x(),p.y(),r,r);}void outtext(point p,char* str){outtextxy(p.x(),p.y(),str);} //界面void InitStack(SqStack &S)//初始化栈{S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base)exit (OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;}int Pop(SqStack &S,SElemType &e)//出栈操作{if(S.top==S.base)return ERROR;e=*--S.top;return OK;}int Push(SqStack &S,SElemType e)//人栈操作{if(S.top-S.base>=S.stacksize){S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top = S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}int StackEmpty(SqStack S)//判栈是否为空{if(S.top==S.base)return OK;elsereturn ERROR;}int CreatALGraph(ALGraph &G)//构建图{ArcNode *p;int i,j, k,info1;int a[11][3]={{1,2,6},{1,3,4},{1,4,5},{2,5,1},{3,5,1},{4,6,2},{5,7,9},{5,8,7},{6,8,4},{7,9,2},{8,9,4}};G.vexnum=9;G.arcnum=11;for (i=1;i<=G.vexnum;i++){G.vertices[i].data=i;G.vertices[i].firstarc=NULL;}for(k=0;k<G.arcnum;k++){i=a[k][0];j=a[k][1];info1=a[k][2];p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info=info1;p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p;}return OK;}void FindInDegree(ALGraph G,int indegree[])//求入度操作{int i;for(i=1;i<=G.vexnum;i++){indegree[i]=0;}for(i=1;i<=G.vexnum;i++){while(G.vertices[i].firstarc){indegree[G.vertices[i].firstarc->adjvex]++;G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc;}}}int ve[100];int TopologicalSort(ALGraph G,SqStack &T) //进行拓扑排序{int indegree[M];FindInDegree(G, indegree);//求各顶点的入度SqStack S;InitStack(S);ArcNode *p;InitStack(S);for (i=1;i<=G.vexnum;i++){if (!indegree[i])Push(S,i);//入度为0者入栈}InitStack(T);int count=0;for(x=1;x<=G.vexnum;x++)// ve[0..G.vexnum-1]=0; {ve[x]=0;}while(!StackEmpty(S)){Pop(S,i);Push(T,i);++count;//输出i号顶点并计数for (p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;if (--indegree[k]==0)//若入度减为0,则入栈{Push(S,k);}if((ve[i]+p->info)>ve[k]){ve[k]= ve[i]+p->info;}}}printf("\n");if (count<G.vexnum)//该图有回路{printf("出现错误\n");}else{printf("排序成功\n");}}int CriticalPath(ALGraph G)//输出G的关键活动{int dut;int j=G.vexnum;int i,k;int ee,el;int vl[100];ArcNode *p;SqStack T;if(!TopologicalSort(G,T)){printf("该图存在环,无法找到关键路径!");return ERROR;}for(i=1;i<=G.vexnum;i++)// vl[0.. G.vexnum-1] =ve[0..G.vexnum-1];//用ve初始化vl {vl[i]=ve[G.vexnum];}while(!StackEmpty(T))for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc){k=p->adjvex;dut=p->info;if((vl[k]-dut)<vl[j]){vl[j]=vl[k]-dut;}}//end of forfor(i=1;i<=G.vexnum;++i){for (p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;dut=p->info;ee=ve[i];el=vl[k]-dut;if(ve[i]==(vl[k]-dut)){setcolor(BLUE);line(g_pos[i],g_pos[k]);}}//end of for(p)}return 1;}//end of CriticalPathvoid paintmain(ALGraph &G){setbkcolor(WHITE);setcolor(BLACK);setfont(-15,0,"微软雅黑");ArcNode *p;int i,j, k,info1;int a[11][3]={{1,2,6},{1,3,4},{1,4,5},{2,5,1},{3,5,1},{4,6,2}, {5,7,9},{5,8,7},{6,8,4},{7,9,2},{8,9,4}};G.vexnum=9;G.arcnum=11;for(k=0;k<G.arcnum;k++){i=a[k][0];j=a[k][1];info1=a[k][2];char str[10]; //画线point p1=g_pos[i];point p2=g_pos[j];int w=info1;itoa(w,str,10);line(p1,p2);outtext((p1+p2)/2,str);p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info=info1;p->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p;}setcolor(RED);for ( i=1; i<=9; ++i) // paint circle{char str[10]="v";itoa(i,str+1,10);fillcircle(g_pos[i],g_r);setbkmode(TRANSPARENT);outtext(g_pos[i]+point(-8,-8),str);}}int main(){ALGraph G;CreatALGraph(G);setinitmode(NULL);initgraph(g_width,g_height);// setcaption("AOE-网演示程序");g_pos[1]=point(35,120);g_pos[2]=point(140,70);g_pos[3]=point(140,180);g_pos[4]=point(140,260);g_pos[5]=point(250,120);g_pos[6]=point(260,260);g_pos[7]=point(360,70);g_pos[8]=point(360,180);g_pos[9]=point(450,120);paintmain(G);setfont(-20,0,"微软雅黑");outtextxy(160,10,"按任意键开始演示...");getch();CriticalPath(G);getch();return 0;}七【上机实验中的其他它问题及心得】经过半学期学习数据结构然后做了这个关键路径的小项目,要写出这个小项目必需要平时努力的学好前面的知识,为后面打下基础才能写好这个程序。
关键路径-数据结构课程设计报告
![关键路径-数据结构课程设计报告](https://img.taocdn.com/s3/m/fe20518183d049649b665830.png)
课程设计报告a)需求分析GreateGraphic():构建AOE网,for(scanf())逐个对图节点信息(包括两邻接点,权值)输入接收,并与分配存储空间。
SearchMapPath()函数:寻找关键路径,构建栈用与存储拓扑排序序列,求得每个节点的相应最早发生时间,最迟完成时间,关键事件的求取,并输出关键路径。
Seekkeyroot()函数:先使用库函数system(‚cls‛)清屏,scanf()对节点数的接收,分配相应的存储空间,调用CreateGraphic()函数和SearchMapPath()函数。
Main()函数:输出主屏信息,判断进入关键路径的程序条件,switch()对条件进行选择。
b)概要设计(1)数据结构typedef struct node{int adjvex;int dut;struct node *next;}edgenode;typedef struct{int projectname;int id;edgenode *lind;}vexnode;(2)程序流程图c)详细设计主函数switch()对条件进行选择判断,进入关键路径的程序,然后对结点数的接收,分配相应的存储空间,构建AOE-网,逐个对图结点信息(包括俩邻接点,权值)输入接收,并与分配存储空间。
寻找关键路径:构建栈用与存储拓扑排序序列,求得每个接点的相应最早发生时间,最迟完成时间,关键事件的求取,并输出关键路径。
d)程序调试(1):C:\Documents and Settings\Administrator\桌面\3\3.cpp(45) : error C2065: 'P' : undeclared identifier (2)C:\Documents and Settings\Administrator\桌面\3\3.cpp(45) : error C2227: left of '->adjvex' must point to class/struct/union(3)C:\Documents and Settings\Administrator\桌面\3\3.cpp(47) : error C2065: 'id' : undeclared identifier 经过仔细的检查,发现45行的‚P‛为大写,我改为小写‘p’以后,运行后只剩下了第三个错误。
关键线路的实验报告总结
![关键线路的实验报告总结](https://img.taocdn.com/s3/m/64f9045ea22d7375a417866fb84ae45c3a35c210.png)
关键线路的实验报告总结我做这个关键线路的实验啊,可真是费了老鼻子劲儿了。
那过程就像走在一条七拐八拐的胡同里,到处都是迷惑人的岔路。
我刚开始做的时候,看着那些线路图,就像看天书似的。
那一堆密密麻麻的线条和节点,瞅得我眼睛直发花。
我旁边那同学,眼睛瞪得像铜铃,嘴里还嘟囔着:“这啥玩意儿啊,比迷宫还迷宫。
”我就跟着应和:“可不是嘛,这要咋整啊。
”我就这么对着那些图研究啊,一会儿挠挠头,一会儿皱皱眉。
我那眉头皱得,都能夹死苍蝇了。
周围的环境也不咋地,实验室里那灯光啊,白晃晃的,照得那些线路图都有点刺眼。
旁边的仪器还嗡嗡作响,就像一群苍蝇在耳边乱飞,搅得人心烦意乱。
我先是按照常规的方法去分析那些线路,找出可能的关键路径。
我就像个工兵在雷区里小心翼翼地排雷一样,一个一个地检查那些线路的可能性。
可是啊,我每次觉得找到了关键线路的时候,一验证就发现不对。
我当时那个懊恼啊,就像吃了一碗热腾腾的面条,突然发现碗底有只苍蝇一样恶心。
这时候,我就去请教老师了。
老师戴着个厚厚的眼镜,镜片后面的眼睛透着一种神秘的智慧。
我凑过去,小心翼翼地问:“老师,这关键线路我咋就找不对呢?”老师看了看我画得乱七八糟的图,微微皱了下眉头,然后不紧不慢地给我讲起来。
他那声音就像老和尚念经似的,不过每一句都挺在理。
我就像个小和尚在听法一样,不住地点头。
听了老师的话,我就像被打通了任督二脉一样,又重新投入到这个找关键线路的战斗中。
我把之前的思路重新整理了一下,把那些错综复杂的线路又重新梳理了一遍。
这时候,我发现之前有些地方是自己想当然了,忽略了一些重要的条件。
我再看那些线路的时候,就感觉它们像是一群听话的孩子,乖乖地把关键线路暴露在我面前。
我当时那个兴奋啊,就像捡到了宝贝似的,忍不住大喊了一声:“哈哈,我找到了!”旁边那同学被我吓了一跳,瞪了我一眼说:“你咋呼啥呢,吓我一跳。
”我就笑嘻嘻地说:“我找到关键线路了,能不高兴嘛。
”这个实验啊,可真让我长了不少见识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} void CriticalPath(GraghAdjlist GL,int n){ int i,j,m,front,rear; int k=0; int ve[NUNUM],vl[NUNUM],e[NUNUM],l[NUNUM]; int tpord[NUNUM]; struct node *p; for(i=1;i<=n;i++){ /*顶点的最早和最迟发生时间,初始化为 0*/ ve[i]=0; vl[i]=0; } front=0; rear=0; for(i=1;i<=n;i++){/*遍历邻接表的表头,查找入度为 0 的顶点*/ if(GL[i].id==0){ rear++; tpord[rear]=i; } } m=0; while(front!=rear){ front++; j=tpord[front]; m++; p=GL[j].link; while(p!=NULL){ k=p->adjvex; GL[k].id=GL[k].id-1; if(ve[j]+(p->dut)>ve[k]) ve[k]=ve[j]+(p->dut); if(GL[k].id==0){ rear++; tpord[rear]=k; } p=p->next; } } if(m<n){ printf("\n Network have circuit!Cannot topological sort!"); return; } for(i=1;i<=n;i++) vl[i]=ve[n];
测试用例 1:如下图(顶点数和边数:9,11)
运行界面如下:
测 试 调 试 及 运 行
也就是有两条关键路径: 1 2 5 7 9 1 2 5 8 9 路径长度为:18
测试用例 2:如下图(顶点数和边数:7,10)
运行界面如下:
也就是有两条关键路径: 1 2 5 7 1 4 5 7 路径长度为:10
思 考
《数据结构与算法(实验) 》实验报告
学院:管理科学与工程
实验 题 目 班级 关键路径 地点
系别:计算机科学与技术
东校实验楼 2-204 时间 2012-3-19
学号
姓名
问 题 描 述
对于给定的一个工程施工图,该图以边为单位从键盘输入,编写能够找出该 图的关键路径的程序。设一个工程有 n 项活动,e 个事件。其中:活动 1——表 示整个工程开始;活动 n——表示整个工程结束. 问题:完成整项工程至少需要多少时间?哪些活动是影响工程进度的关键?
数 据 模 型 与 需 求 描 述
Ve(j)——表示事件 Vj 的最早发生时间 Vl(j)——表示事件 Vj 的最迟发生时间 e(i)——表示活动 ai 的最早开始时间 l(i)——表示活动 ai 的最迟开始时间 l(i)-e(i)——表示完成活动 ai 的时间余量 关键活动——关键路径上的活动,即 l(i)=e(i)的活动 设活动 ai 用弧<j,k>表示,其持续时间记为:dut(<j,k>)。则有: e(i)=Ve(j) l(i)=Vl(k)-dut(<j,k>) 如何求 Ve(j)和 Vl(j)? 从 Ve(1)=0 开始向前递推 Ve( j ) = Max{Ve(i ) + dut (< i, j >)}, < i, j >∈ T ,2 ≤ j ≤ n
概 CreateGraph () 求解关键路径函数:CriticalPath ()
详 细 设 计
int Criticalpath(ALGraph G){ /* G 为有向网,输出 G 的各项关键活动。*/ InitStack(T); /*建立用于产生拓扑逆序的栈 T*/ if (! TopologicalOrder (G,T) ) return 0;/*该有向网有回路返回 0*/ vl[0..G.vexnum-1] = ve [G.vexnum-1]; /* 初始化顶点事件的最迟发生 时间*/ while (! StackEmpty (T) ) /*按拓扑逆序求各顶点的 vl 值*/ for (Pop(T,j), p=G. adjlist[j].firstedge; p; p=p->next){ k=p->adjvex; dut = * (p->info); if ( vl [k]-dut < vl [j] ) vl [j] = vl [k] – dut; } for ( j=0; j<G. vexnum; + +j) /*求 e、l 和关键活动*/ for (p=G.adjlist [j].firstedge; p; p = p->next) { k = p->adjvex; dut= * (p->indo); e = ve [j]; l = vl [k] - dut; tag = (e= =l) ? ‘*’:’’ ; printf ( j,k,dut,e,l,tag ); /*输出关键活动*/ } return 1; /*求出关键活动后返回 1*/ } /*Criticalpath*/
i
其中T是所有以 j为头的弧的集合
从 Vl(n)=Ve(n)开始向后递推
Vl (i ) = Min{Vl ( j ) − dut (< i, j >)}, < i, j >∈ S ,1 ≤ i ≤ n − 1
j
其中S是所有以 i为尾的弧的集合
程序功能:根据输入的图的信息,能够建立 AOE-网,并能够输出关键路径所 在的边。
源 程 序 清 单
#include<malloc.h> #include<stdio.h> #define MAX 20 /*头结点的最大值*/ #define NUNUM 20 struct node{ int adjvex; /*顶点信息,序号*/ int dut; /*权值*/ struct node *next; }; typedef struct vnode{ /*头结点定义*/ int vertex; /*顶点信息,序号*/ int id; /*顶点入度*/ struct node *link; /*头结点的链域,指向后续邻接点*/ }vnode; typedef vnode GraghAdjlist[MAX]; GraghAdjlist G; /*构建图*/ void CreateGraph(GraghAdjlist GL,int n,int e){ int i,j,k,l; struct node * p;/*开辟新的邻接点所用的指针类型变量*/ for(i=1;i<=n;i++){ /*建立顶点表*/ GL[i].vertex=i; GL[i].id=0; GL[i].link=NULL; } for(k=1;k<=e;k++){ printf("Please input [%d]two incident vextex number and weight: ",k); scanf("%d,%d,%d",&i,&j,&l); p=(struct node *)malloc(sizeof(struct node)); p->adjvex=j; p->dut=l; p->next=GL[i].link; GL[i].link=p; /*将新结点插入到顶点 Vi 的边表头部*/ } for(i=1;i<=n;i++){ p=GL[i].link; while(p!=NULL){ k=p->adjvex; GL[k].id=GL[k].id+1; p=p->next; } }
for(i=n-1;i>=1;i--){ j=tpord[i]; p=GL[j].link; while(p!=NULL){ k=p->adjvex; if((vl[k]-p->dut)<vl[j]) vl[j]=vl[k]-(p->dut); p=p->next; /*对其下一个邻接点进行同样的操作*/ } } i=0; for(j=1;j<=n;j++){ p=GL[j].link; while(p!=NULL){ k=p->adjvex; i++; e[i]=ve[j]; l[i]=vl[k]-(p->dut); printf("<%d ,%d>:",GL[j].vertex,GL[k].vertex); if(l[i]==e[i]) printf("is the key acctivity!\n"); else printf("is not the key acctivity!\n"); p=p->next; } } } void main(){ int n,e; printf("Please input vexnum and edgenum of the gragh: ");; scanf("%d,%d",&n,&e); CreateGraph(G,n,e); CriticalPath(G,n); system("PAUSE"); } 感悟--收获 经验—教训