数据结构课程设计——关键路径

合集下载

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

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

数据结构中的关键路径算法解析关键路径算法是一种用于确定项目关键路径的方法,它可以帮助我们找到项目中耗时最长的路径,从而可以合理地安排任务和资源,提高项目完成的效率。

在数据结构中,关键路径算法也有着重要的应用。

本文将对数据结构中的关键路径算法进行解析和讨论。

一、什么是关键路径算法?关键路径算法是一种基于网络图的分析工具,它通过构建工程项目的网络模型,确定项目中的关键路径,以便更好地控制和管理项目进度。

关键路径是指项目中最长时间的路径,这条路径上的每个任务都是不能延误的,否则将会对整个项目的完成时间产生直接影响。

二、关键路径算法的基本步骤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存在。

数据结构课程设计关键路径

数据结构课程设计关键路径

数据结构课程设计关键路径数据结构课程设计-关键路径#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;<>。

数据结构课程设计报告 关键路径的实现

数据结构课程设计报告 关键路径的实现

青岛理工大学数据结构课程设计报告题目:关键路径的实现院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 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)逻辑结构采用图状的结构。

图是一种较线性表和树更为复杂的数据结构。

在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关;而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

数据结构 关键路径

数据结构 关键路径

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讲关键路径与最短路径

数据结构第19讲关键路径与最短路径关键路径与最短路径是数据结构中非常重要的概念和算法。

它们在许多领域中都有广泛的应用,包括项目管理、网络通信、物流运输等等。

本文将介绍关键路径和最短路径的概念、算法以及它们的应用。

一、关键路径关键路径是指在一个项目中,所有活动中最长的路径,也即完成整个项目所需的最长时间。

关键路径的长度决定了项目的最短完成时间,因此对于项目管理非常重要。

关键路径的计算通常使用网络图来表示项目的各个活动以及它们的前后关系。

在网络图中,每个活动用一个节点表示,活动之间的关系用边来表示。

活动之间的关系可以分为两种:顺序关系和并行关系。

1.顺序关系:活动A必须在活动B之前完成,这种关系用有向边表示。

2.并行关系:活动A和活动B可以同时进行,这种关系用无向边表示。

关键路径算法通过在网络图上进行正向遍历和逆向遍历来计算关键路径。

具体步骤如下:1.正向遍历:从起始节点出发,计算每个节点的最早开始时间。

最早开始时间是指在没有任何延迟的情况下,从起始节点到达该节点所需的最短时间。

2.逆向遍历:从终点节点出发,计算每个节点的最晚开始时间。

最晚开始时间是指在不延误整个项目完成时间的情况下,从终点节点回到该节点所需的最短时间。

3.计算关键路径:根据每个节点的最早开始时间和最晚开始时间,找出那些最早开始时间和最晚开始时间相等的节点,这些节点就是关键路径上的节点。

关键路径的计算可以有效地帮助项目管理者确定项目的最短完成时间,并将各个活动按照优先级进行排序和调度,从而提高项目的管理效率。

二、最短路径最短路径是指在一个加权图中,从起点到终点所经过的边的权值之和最小的路径。

最短路径算法有很多种,下面介绍两种常用的最短路径算法:迪杰斯特拉算法和弗洛伊德算法。

1.迪杰斯特拉算法:迪杰斯特拉算法是一种贪心算法,用于解决单源最短路径问题。

具体步骤如下:-创建两个集合S和V-S,分别用于存放已确定最短路径的节点和待确定最短路径的节点。

数据结构关键路径

数据结构关键路径

数据结构关键路径 如果在有向⽆环图中⽤有向边表⽰⼀个⼯程中的各项活动(Activity),⽤有向边上的权值表⽰活动的持续时间(duration),⽤顶点表⽰事件(Event),则这种有向图叫做⽤边表⽰活动的⽹络(activity on edges),简称AOE⽹络。

例如: 其中,E i表⽰事件,a k表⽰活动。

E0是源点,E8是汇点。

完成整个⼯程所需的时间等于从源点到汇点的最长路径长度,即该路径中所有活动的持续时间之和最⼤。

这条路径称为关键路径(critical path)。

关键路径上所有活动都是关键活动。

所谓关键活动(critical activity),是不按期完成会影响整个⼯程进度的活动。

只要找到关键活动,就可以找到关键路径。

与计算关键活动有关的量: 1 事件E i的最早可能开始时间:Ee[i]—从源点E0到顶点E i的最长路径长度。

在上图中,Ee[4]=7。

2 事件E i的最迟允许开始时间:El(⼩写L)[i]—在保证汇点E n-1最迟允许开始时间El[n-1]等于整个⼯程所需时间的前提下,等于El[n-1]减去从E i到E n-1的最长路径长度。

3 活动a k的最早可能开始时间:e[k]—设该活动在有向边<E i,E j>上,从源点E0到顶点E i的最长路径长度,即等于Ee[i]。

4 活动a k的最迟允许开始时间:l(⼩写L)[k]—设该活动在有向边<E i,E j>上,在不会引起时间延误的前提下,允许的最迟开始时间。

l[k]=El[j]-dur(<E i,E j>),其中dur(<E i,E j>)是完成该活动所需的时间,即有向边<E i,E j>的权值。

l[k]-e[k]表⽰活动a k的最早可能开始时间和最迟允许开始时间的时间余量,也叫做松弛时间(slack time)。

没有时间余量的活动是关键活动。

算法步骤: 1 输⼊顶点数和边数,再输⼊每条边的起点编号、终点编号和权值。

数据结构关键路径

数据结构关键路径

数据结构关键路径数据结构是计算机科学中非常重要的一门学科,它主要研究数据之间的组织方式和操作方法。

在计算机程序中,数据结构的选择和设计对程序的性能和效率有着重要的影响。

在数据结构中,关键路径是一个关键概念,它指的是一个任务完成所需要的最长时间。

1. 什么是关键路径在项目管理中,关键路径是指在一个项目的所有任务中,完成项目所需要的最长时间路径。

这条路径上的任务是项目完成的关键,如果其中任何一个任务延迟,整个项目的进度都会受到影响。

在数据结构中,关键路径指的是在一个算法或操作中,完成所需的最长时间。

它是算法或操作的瓶颈,决定了整个操作的效率。

2. 关键路径的计算方法计算关键路径的方法主要有两种:事件法和任务法。

事件法是一种图论的方法,通过绘制和分析项目的网络图来确定关键路径。

任务法是一种优化方法,通过对任务进行排序和计算来确定关键路径。

在数据结构中,计算关键路径通常是通过分析算法的复杂度来完成的。

算法的复杂度可以分为时间复杂度和空间复杂度,其中时间复杂度是计算算法执行所需的时间,空间复杂度是计算算法执行所需的空间。

通过分析算法的复杂度,可以确定算法的关键路径。

3. 关键路径的应用关键路径在数据结构中有着广泛的应用。

在算法设计中,关键路径可以帮助程序员找到算法的瓶颈并进行优化。

通过优化关键路径上的操作,可以提高算法的效率和性能。

此外,关键路径还可以应用于网络流量分析、图像处理、数据压缩等领域。

在网络流量分析中,关键路径可以帮助分析网络中的瓶颈和拥堵点,从而优化网络结构和提高传输效率。

在图像处理中,关键路径可以帮助找到图像处理的关键步骤,从而提高图像处理的速度和质量。

在数据压缩中,关键路径可以帮助找到数据压缩的关键操作,从而提高数据的压缩比例。

4. 关键路径的挑战尽管关键路径在数据结构中有着广泛的应用,但它也面临一些挑战。

首先,计算关键路径的过程通常是复杂且耗时的,需要对算法进行详细的分析和计算。

其次,关键路径可能随着算法或操作的不同而变化,需要根据具体情况进行调整和优化。

数据结构(五)图---关键路径

数据结构(五)图---关键路径

数据结构(五)图---关键路径⼀:定义(⼀)最短时间我们要对⼀个流程图获得最短时间,就要分析他们的拓扑关系,并且找到当中的最关键的流程,这个流程的时间就是最短时间(⼆)AOE⽹(Activity On Edge Network)在⼀个表⽰⼯程的带权有向图中,⽤到的表⽰时间,⽤有向边表⽰活动,⽤边上权值表⽰活动的持续时间,这种有向图的边表⽰活动的⽹,我们称之为AOE⽹我们将AOE⽹中没有⼊边的顶点称为源点或始点,没有出边的顶点称为终点或者汇点正常情况下,AOE⽹只有⼀个源点⼀个终点例如下图AOE⽹,v0为源点,表⽰整个⼯程的开始,v9为终点,表⽰这个⼯程的结束。

顶点v0,v1,....v9分别表⽰事件弧<v0,v1>,<v0,v2>,...,<v8,v9>都表⽰⼀个活动,⽤a0,a1,...,a12表⽰补充:相⽐于AOV⽹AOV中不在意边的权值,不局限⼀个源点和⼀个终点,关注的是是否构成环AOE关注边的权值,来求得最短时间等信息,源点和终点都只有⼀个(三)关键路径路径上各个活动所持续的事件之和称为路径长度,从源点到终点具有最⼤长度的路径叫关键路径,在关键路径上的活动叫关键活动例如我们开始组装时候,我们就要等到前⾯的所有装备⼯作全部完成(按照最长路径来算),才能开始我们的组装任务。

所以我们的关键路径需要是最⼤长度的路径⼆:AOE和AOV(活动和事件|顶点与弧)AOE⽹是表⽰⼯程流程的,所以它就具有明显的⼯程的特性。

只有在某顶点所表⽰的事件发⽣后,从该顶点出发的各活动才能开始。

只有在进⼊某顶点的各活动都已经结束,该顶点所代表的事件才能发⽣。

AOE与AOV对⽐虽然都是⽤来对⼯程建模,但是还是有很⼤不同。

主要体现在:AOV⽹是顶点表⽰活动的⽹,他只描述活动之间的制约更新,AOE⽹是⽤边表⽰活动的⽹,边上的权值表⽰活动持续的时间AOE⽹是要建⽴在活动之间制约关系没有⽭盾的基础之上,再来分析完成整个⼯程⾄少需要多少时间,或者为缩短完成⼯程所需时间,应该加快哪些活动等问题三:四个必要参数在AOE⽹中顶点v表⽰时间,边e表⽰活动(⼀)事件最早发⽣时间etv(earliest time of vertex)即顶点Vk的最早发⽣时间(⼆)事件最晚发⽣时间ltv(lastest time of vertex)即顶点Vk的最晚发⽣时间,也就是每个顶点对应的事件最晚需要开始的事件,超出此事件将会延误整个⼯期(三)活动的最早开⼯时间ete(earliest time of edge)即弧ak的最早发⽣时间(四)活动的最晚开⼯时间lte(lastest time if edge)即弧的最晚发⽣时间,也就是不推迟⼯期的最晚开⼯时间总结(重点):我们可以由事件的最早发⽣时间和事件的最晚发⽣时间求出活动的最早和最晚开⼯时间。

数据结构-关键路径和拓扑排序

数据结构-关键路径和拓扑排序

《数据结构》课程设计报告设计题目:关键路径与拓扑排序姓名:_____ __李崇远___ _____学号:________211415059________专业:_____ _物联网工程___ ___院系: 计科学院_________班级:____ __1406___ ____指导教师:_____ _王江涛___ _______2016年 1月 8日摘要关键路径是计划项目活动中用到的一种算数方法。

对于有效的计划管理而言,关键路径是一种十分重要的工具。

关键路径通常是决定项目工期的进度活动序列,很小的浮动也可能影响整个项目。

拓扑排序常用来确定一个依赖关系集中,事物发生的顺序,可用于计算项目的进行顺序,但顺序并不唯一。

关键字:关键路径拓扑排序AbstractCritical Path is an arithmetic method used in project activities.For the purposes of effective program management, critical Path is a very important tool.Critical path schedule activities usually sequence determines the duration of the project, small float can also affect the entire project.Topological Order used to determine a dependency set, the order of things happen, the order can be used to calculate the project, but the order is not unique.Keywords:Critical Path, Topological Order目录目录一、问题描述(内容格式参考下面的描述,以下类似) (4)二、需求分析 (4)三、概要设计 (4)四、数据结构设计 (4)五、算法设计 (5)1、算法分析(必须要用语言进行描述) (5)2、算法实现 (5)六、程序测试与实现 (6)1、函数之间的调用关系 (6)2、主程序 (6)3、测试数据 (6)4、测试结果 (6)七、调试分析 (6)八、遇到的问题及解决办法 (6)九、心得体会 (6)一、问题描述题目内容:通过邻接表完成AOE网的创建,并输出图的拓扑序列和关键路径。

数据结构课程设计_拓扑排序和关键路径

数据结构课程设计_拓扑排序和关键路径

1 ABSTRACT1.1 图和栈的结构定义struct SqStack////栈部分{SElemType *base;// 栈底指针SElemType *top;// 栈顶指针int stacksize;// 栈的大小int element_count;//栈中元素个素};/////////AOE网的存储结构struct ArcNode //表结点{int lastcompletetime;//活动最晚开始时间int adjvex; //点结点位置int info; //所对应的弧的权值struct ArcNode *next;//指向下一个表结点指针};struct VNode //点结点{VertexType data; //结点标志int indegree;// 该结点入度数int ve; // 记录结点的最早开始时间int vl;// 记录结点的最晚开始时间struct ArcNode *first_out_arc; //存储下一个出度的表结点struct ArcNode *first_in_arc;//存储下一个入度的表结点};struct ALGraph{ VNode *vertices; //结点数组int vexnum; //结点数int arcnum; //弧数int kind;// 该图的类型};2系统总分析2.1 关键路径概念分析2.1.1 什么是关键路径关键路径法 (Critical Path Method, CPM)最早出现于20世纪50年代,它是通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析。

这种方法产生的背景是,在当时出现了许多庞大而复杂的科研和工程项目,这些项目常常需要运用大量的人力、物力和财力,因此如何合理而有效地对这些项目进行组织,在有限资源下以最短的时间和最低的成本费用下完成整个项目就成为一个突出的问题,这样 CPM 就应运而生了。

关键路径问题数据结构课程设计

关键路径问题数据结构课程设计

关键路径问题数据结构课程设计一、引言二、关键路径问题概述1.定义2.应用场景三、关键路径问题算法分析1.活动网络图的表示方法2.计算活动最早开始时间和最晚开始时间3.计算活动最早结束时间和最晚结束时间4.确定关键路径及其长度四、数据结构设计与实现1.数据结构选择与设计思路2.程序实现流程图及详细说明五、测试与分析结果展示六、总结与展望一、引言在项目管理中,关键路径问题是一个重要的问题,它可以帮助我们确定项目完成所需的最短时间,并且能够帮助我们找到项目中的瓶颈点。

本文将介绍关键路径问题的概念和算法分析,并以数据结构课程设计为背景,详细阐述数据结构设计与实现。

二、关键路径问题概述1.定义关键路径指的是项目中最长的一条连续活动序列,这些活动之间没有任何浮动时间,也就是说如果这些活动出现了延误,整个项目都会受到影响。

因此,在项目管理中,我们需要找到这条关键路径,并尽可能地缩短它的长度。

2.应用场景关键路径问题在项目管理中有广泛的应用,例如建筑工程、软件开发等。

在建筑工程中,我们需要确定每个活动的时间和优先级,以便确定项目完成所需的最短时间。

在软件开发中,我们需要确定每个模块的依赖关系和优先级,以便确定项目完成所需的最短时间。

三、关键路径问题算法分析1.活动网络图的表示方法活动网络图是一种图形化表示方法,它可以帮助我们清晰地了解整个项目中各项任务之间的依赖关系。

在活动网络图中,每个任务都表示为一个节点,并且每个任务之间都有一条边表示它们之间的依赖关系。

2.计算活动最早开始时间和最晚开始时间在计算关键路径时,我们需要计算每个活动的最早开始时间和最晚开始时间。

最早开始时间指的是该活动可以开始执行的最早时间,而最晚开始时间指的是该活动必须开始执行的最晚时间。

3.计算活动最早结束时间和最晚结束时间与计算开始时间类似,在计算关键路径时,我们还需要计算每个活动的最早结束时间和最晚结束时间。

最早结束时间指的是该活动可以完成执行的最早时间,而最晚结束时间指的是该活动必须完成执行的最晚时间。

课程设计寻找关键路径

课程设计寻找关键路径

课程设计寻找关键路径一、教学目标本课程的教学目标是让学生掌握寻找关键路径的方法和技巧,能够运用到实际问题中。

具体分为以下三个部分:知识目标:使学生了解关键路径的定义、特点和应用场景,理解关键路径的计算方法和步骤。

技能目标:培养学生运用关键路径法分析问题、解决问题的能力,能够独立完成寻找关键路径的操作。

情感态度价值观目标:培养学生对寻找关键路径的兴趣,使其认识到关键路径在项目管理和生活中的重要性,培养学生的团队合作意识和责任感。

二、教学内容本课程的教学内容主要包括以下几个部分:1.关键路径的定义和概念:介绍关键路径的定义、特点和应用场景,使学生了解关键路径的基本概念。

2.关键路径的计算方法:讲解关键路径的计算步骤,包括时间参数的确定、网络图的绘制和路径的查找等。

3.关键路径的应用:通过案例分析,使学生掌握关键路径在项目管理和生活中的实际应用。

4.寻找关键路径的技巧:介绍寻找关键路径的技巧和方法,提高学生解决问题的能力。

三、教学方法为了达到本课程的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解关键路径的定义、计算方法和应用,使学生掌握基本知识。

2.案例分析法:通过分析实际案例,使学生了解关键路径在项目管理和生活中的应用。

3.实验法:让学生动手实践,绘制网络图和寻找关键路径,提高学生的操作能力。

4.讨论法:分组讨论,引导学生思考和探索寻找关键路径的技巧和方法。

四、教学资源为了支持本课程的教学内容和教学方法,将准备以下教学资源:1.教材:选用权威、实用的教材,为学生提供系统的学习资料。

2.参考书:提供相关参考书籍,丰富学生的知识体系。

3.多媒体资料:制作课件、动画等多媒体资料,帮助学生形象地理解关键路径的概念和计算方法。

4.实验设备:准备实验器材,为学生提供动手实践的机会。

5.网络资源:利用网络资源,为学生提供更多实例和拓展知识。

五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:评估学生在课堂上的参与度、提问回答情况等,以体现学生的学习态度和积极性。

数据结构与算法—关键路径

数据结构与算法—关键路径

关键路径若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续时间),则此带权的有向图称为边表示活动的网(Activity on Edge Network) ,简称AOE 网。

【例】图7.21 是一个网。

其中有9 个事件v 1 , v 2 , … , v 9 ;11 项活动 a 1 , a 2 , … , a 11 。

每个事件表示在它之前的活动已经完成,在它之后的活动可以开始。

如v 1 表示整个工程开始,v 9 表示整个工程结束。

V 5 表示活动a 4 和a 5 已经完成,活动a 7 和a 8 可以开始。

与每个活动相联系的权表示完成该活动所需的时间。

如活动 a 1 需要 6 天时间可以完成。

(1)AOV 网具有的性质⒈只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始。

⒉只有在进入某一顶点的各有向边所代表的活动都已经结束,该顶点所代表的事件才能发生。

⒊表示实际工程计划的AOE 网应该是无环的,并且存在唯一的入度过为0 的开始顶点和唯一的出度为0 的完成顶点。

(2)由事件v j 的最早发生时间和最晚发生时间的定义, 可以采取如下步骤求得关键活动:1. 从开始顶点v 1 出发, 令ve(1)=0, 按拓扑有序序列求其余各顶点的可能最早发生时间。

Ve(k)=max{ve(j)+dut(<j,k>)} (7.1 )j ∈T其中T 是以顶点v k 为尾的所有弧的头顶点的集合(2 ≤ k ≤ n) 。

如果得到的拓朴有序序列中顶点的个数小于网中顶点个数n ,则说明网中有环,不能求出关键路径,算法结束。

2. 从完成顶点v n 出发,令vl(n)=ve(n) ,按逆拓朴有序求其余各顶点的允许的最晚发生时间: vl(j)=min{vl(k)-dut(<j,k>)}k ∈S其中S 是以顶点v j 是头的所有弧的尾顶点集合(1 ≤ j ≤ n-1) 。

数据结构课程设计报告 关键路径的实现

数据结构课程设计报告 关键路径的实现

青岛理工大学数据结构课程设计报告题目:关键路径的实现院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 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)逻辑结构采用图状的结构。

图是一种较线性表和树更为复杂的数据结构。

在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其孩子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关;而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

数据结构课程设计报告---关键路径

数据结构课程设计报告---关键路径

数据结构课程设计报告---关键路径数 据 结 构课 程 设 计报 告院系: 信息管理学院 专业: 软件工程班级: 软件Q1141学号: 11150038姓名: 李艳平 教师: 邓沌华时间: 2013.4.2理论成绩 实践成绩 总成绩目录一、问题的描述二、系统需求及分析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)。

《数据结构》最短路径关键路径及其应用解析

《数据结构》最短路径关键路径及其应用解析

a3
a8
a1
a7
a4
a9
a2
a5
a6
施工从活动 a1、 a2开始,到达活动 a8和 a9时,整个 施工结束。这类有向图中,顶点表示活动,弧< ai, aj >表示活动 ai优先于活动 aj ,称这类有向图为顶点 表示活动的网(AOV网)。
AOV网可解决如下两个问题: (1)判定工程的可行性。显然,有回路,整个工 程就无法结束
D(-1)
D(0)
D(1)
D(2)
D
0
1
2
0
1
2
0
1
2
0
1
2
0
0
4 11 0
4 11 0
4
6
0
4
6
1
6
0
2
6
0
2
6
0
2
5
0
2
2
3
0
3
7
0
3
7
0
3
7
0
P(-1)
P(0)
P(1)
P(2)
P
0
1
2
0
1
2
0
1
2
0
1
2
0
AB AC
AB AC
AB ABC
AB ABC
1 BA
BC BA
BC BA
BC BCA
BC
2 CA
则图G的邻接矩阵为:
+
甲 乙 丙 丁 戊己
+
甲∞ ∞ 7 4 ∞ ∞
+
+
乙2 ∞ ∞ ∞ ∞ 8
+

关键路径-数据结构课程设计报告

关键路径-数据结构课程设计报告

课程设计报告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’以后,运行后只剩下了第三个错误。

关键路径_数据结构(C语言)_[共3页]

关键路径_数据结构(C语言)_[共3页]

第9章图151 动a0需要的时间是6个单位时间(天/时/分)。

图9.16 AOE网络9.5.2 关键路径与AOV网络不同,AOE网常用于工程时间的估算,主要研究以下两方面问题。

(1)整个工程至少需要多少时间;(2)哪些活动是影响工程进度的关键。

关键路径算法是解决这些问题的一种方法。

所谓关键路径,是指AOE网络中,从开始顶点到完成顶点的最长路径。

完成工程所需的最短时间是关键路径的长度,也就是关键路径上各边的权之和。

关键路径上的活动称为关键活动。

关键活动是影响整个工程进度的关键,如果这些活动不能按期完成,将会影响整个工程的进度。

图9.16中,关键路径是(v0,v1,v4,v7,v8),此路径上的关键活动为a0,a3,a7,a10,关键路径长度为19。

这就是说,整个工程至少需要19个单位时间才能完成。

为确定关键路径,先假定有一个包含n个事件和e个活动的AOE网,源点是事件v0,汇点是事件v n−1,且定义以下四个相关的变量。

(1)事件v i的可能的最早发生时间earliest(i):是从开始顶点v0到顶点v i的最长路径的长度。

例如,图9.16中,事件v4的可能的最早发生时间是v0到顶点v4的最长路径(v0,v1,v4),其长度为7,所以earliest(4)=7。

同理可求得,earliest(5)= 7,earliest(8)=19。

(2)事件vi的允许的最迟发生时间latest(i):是在不影响工期的条件下,事件v i允许的最晚发生时间,等于earliest(n−1)减去从v i到v n−1的最长路径的长度。

例如,latest(4)= earliest(8)−(8+4)=19−(8+4)=7。

同理可求得,latest(5)= earliest(8)−(4+4)=11,latest(7)=earliest(8)−4=19−4=15。

(3)活动ak可能的最早开始时间early(k):设活动a k关联的边为<v i,v j>,则early(k)=earliest(i)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》课程设计报告课程题目:关键路径学院:班级:学号:姓名:指导教师:完成日期:目录一、需求分析 ............................... 错误!未定义书签。

二、概要设计 ............................... 错误!未定义书签。

三、详细设计 ............................... 错误!未定义书签。

四、调试分析 .............................. 错误!未定义书签。

五、用户使用说明 ...................... 错误!未定义书签。

六、测试结果 .............................. 错误!未定义书签。

七、附录 ..................................... 错误!未定义书签。

一、需求分析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 a4 3v3 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存在。

操作结果:构造一个图的顶点数为MAX,弧的个数也为MAX,其他信息都相应初始化了的图。

CreatGraph(& G);初始条件:已经初始化了的图G。

操作结果:通过输入函数输入图的顶点个数,各顶点信息,弧的条数,以及弧的其他信息,构造图G。

}2、抽象数据类型栈的定义如下:ADT Stack {数据对象:D={ai | ai ∈ElemSet,i=1,2,…,n,n≥0}数据关系:Rl={<ai-1,ai>| ai-1,ai∈D,i=2,…,n }约定a n端为栈顶,a i端为栈底。

基本操作:InitStack(&S)操作结果:构造一个空栈S。

StackEmpty(S)初始条件:栈S已经存在。

操作结果:若栈S为空栈,则返回TRUE,否则FALSE。

Push(&S,e)初始条件:栈S已经存在。

操作结果:插入元素e为新的栈顶元素。

Pop(&S,&e)初始条件:栈S已存在且不为空。

操作结果:删除S的栈顶元素,并用e返回其值。

}三、详细设计1、图的邻接表存储结构如下:#define MAX 20typedef struct ArcNode irst=NULL;}void CreateGraphic(ALGraph &G){int i,j,s,n;ArcNode *p,*pp; ata); irst=NULL; ata)==0) 则停止查找,并保存弧尾break; 所示的顶点在头结点中的序号j for(s=0;s<;s++) ata)==0) 则停止查找,并保存弧头break; 所示的顶点在头结点中的序号s pp=(ArcNode *)malloc(sizeof(ArcNode)); irst!=NULL) irst; irst=pp; irst;p;p=p->next){ irst;p;p=p->next){ ata);irst;p;p=p->next){ k=p->adjvex;ee=ve[j];el=vl[k]-(p->info2);if(el==ee) printf("%s ",p->info1);}}printf("\n");return OK;}四、调试分析1、本次课程设计题目思路特别清晰,算法特别简单,但是在编程过程中遇到了一系列的问题都值得思考与分析。

2、首先是在图的创建过程中,用邻接表创建图的时候,指针使用没有正确到位而引发了一系列问题,后来通过与老师同学一起分析才找到了问题的症结所在。

之前用临时指针p保存头结点的first指针,然后让p指向已经存好信息的表结点pp,这样操作并没有真正把它连起来,下次循环时,又覆盖了原来的信息。

3、在成功创建了图后,把主函数中生成的图作为参数传给Critial()时,又发现原来图中的活动这一信息又改变了,全变成乱码了,原来是由于存放活动的字符串str3,由于不断的输入,导致最后字符串什么也没有了,而图中每个弧的活动指针都指向它,所以就全乱了,后来就把它改为字符串数组,并且把它设为全局变量。

4、在调试Critial()这一函数中,也遇到了一些问题,在观察零入度栈S的栈顶元素和拓扑序列栈T的时候,在watch窗口中输入*,发现一直乱变,根本不知道它的栈内元素,甚至怀疑栈的初始化函数有没有写对,后来通过查找以前堆栈类型问题以及与同学题目作对比才发现就是由于窗口输入内容写错了,应该改为*。

五、用户使用说明第一行输入顶点个数vexnum。

第二行输入各个顶点的名称。

第三行输入弧的边数arcnum。

接下来的arcnum行输入每一条弧的弧尾顶点、弧头顶点、活动以及权值大小。

六、测试结果七、附录以下是该程序设计的完整代码:#include<>#include<>#include<>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define MAX 20#define SIZEMAX 20#define ADD 10typedef int Status;typedef int Infotype;typedef char Vertextype; typedef int Elemtype; int ID[MAX]={0};int ve[MAX]={0};char str3[MAX][10]; typedef struct ArcNode {int adjvex;struct ArcNode * next; char * info1;int info2;}ArcNode;typedef struct VNode {Vertextype data[3]; ArcNode * first;}VNode,AdjList[MAX]; typedef struct{AdjList vertices;int vexnum;int arcnum;}ALGraph;typedef struct{Elemtype * base;Elemtype * top;int maxsize;}Stack;void Init(ALGraph &G){=MAX;=MAX;for(int i=0;i<;i++)[i].first=NULL;}void CreateGraphic(ALGraph &G){int i,j,s,n;ArcNode *p,*pp;char str1[10],str2[10];scanf("%d\n",&;for(i=0;i<;i++){scanf("%s",[i].data);[i].first=NULL;}scanf("%d\n",&;for(i=0;i<;i++){scanf("%s%s%s%d",str1,str2,str3[i],&n);for(j=0;j<;j++)if(strcmp(str1,[j].data)==0)break;for(s=0;s<;s++)if(strcmp(str2,[s].data)==0)break;pp=(ArcNode *)malloc(sizeof(ArcNode));pp->adjvex=s;pp->info1=str3[i];pp->info2=n;pp->next=NULL;ID[s]++;if[j].first!=NULL){p=[j].first;if(p->next!=NULL){while(p->next->next!=NULL){p=p->next;}p=p->next;}p->next=pp;}else[j].first=pp;}}Status InitStack(Stack &S){=(Elemtype *)malloc(SIZEMAX*sizeof(Elemtype));if(! exit (OVERFLOW);=;=SIZEMAX;return OK;}Status Pop(Stack &S,int &e){if== return ERROR;e=*;return OK;}Status Push(Stack &S,int e){if{=(Elemtype *)realloc,+add)*sizeof(Elemtype));if(! exit (OVERFLOW);=+;=+add;}*++)=e; irst;p;p=p->next){k=p->adjvex; ID[k]--;if(ID[k]==0) Push(S,k);if( ( ve[j] + (p->info2) ) > ve[k] )ve[k]=ve[j]+(p->info2);}}if(count< return ERROR;else return OK;}Status Critial(ALGraph G){int i,j,k,ee,el;int vl[MAX];Stack T;InitStack(T);ArcNode * p;if(!Topo(G,T)) return ERROR;for(i=0;i<;i++) vl[i]=ve[];while(!Empty(T)){for(Pop(T,j),p=[j].first;p;p=p->next){k=p->adjvex;if(vl[k]-(p->info2)<vl[j]) vl[j]=vl[k]-(p->info2);}}printf("关键顶点为a:");for(j=0;j<;j++){if(ve[j]==vl[j]) printf("%s ",[j].data);}printf("\n");printf("关键路径为a:");for(j=0;j<;j++){for(p=[j].first;p;p=p->next){k=p->adjvex;ee=ve[j];el=vl[k]-(p->info2);if(el==ee) printf("%s ",p->info1);}}printf("\n");return OK;}int main(){ALGraph G;Init(G);CreateGraphic(G);Critial(G);return 0;}。

相关文档
最新文档