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

合集下载

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

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

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

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

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

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

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

二、关键路径算法的基本步骤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),然后按照上述算法的步骤进行计算。

求关键路径设计报告 数据结构课程设计毕业设计(论文)word格式

求关键路径设计报告 数据结构课程设计毕业设计(论文)word格式

数据结构课程设计题目:关键路径的设计报告科系:计算机科学与技术班级:姓名:题目: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进行拓扑排序。

数据结构第19讲_关键路径与最短路径_C

数据结构第19讲_关键路径与最短路径_C

数据结构第19讲_关键路径与最短路径_C 在数据结构的学习过程中,我们经常会遇到需要寻找最短路径的问题。

最短路径问题是指在图中寻找连接两个顶点之间最短路线的问题。

在实际生活中,最短路径问题广泛应用于交通、通信等领域。

在本篇文章中,我们将介绍关键路径和最短路径的概念,以及它们在实际问题中的应用。

首先,让我们来介绍关键路径。

关键路径是指在项目管理中,连接起始点和终止点的最长路径,也是项目完成所需要的最短时间。

关键路径可以通过计算活动的最早开始时间(EST)和最晚开始时间(LST)来确定。

活动的EST是指在没有任何限制条件下,活动可以最早开始的时间;而LST则是指在不影响项目完成时间的前提下,活动可以最晚开始的时间。

关键路径的长度等于项目的最早完成时间和最晚完成时间相等的活动的持续时间之和。

通过确定关键路径,我们可以优化项目进度,提高项目的整体效率。

接下来,让我们来介绍最短路径。

最短路径是指在图中寻找连接两个顶点之间最短路线的问题。

最短路径可以通过使用一些经典的算法来解决,例如迪杰斯特拉算法和弗洛伊德算法。

迪杰斯特拉算法是一种贪心算法,通过计算出从起点到其他顶点的最短路径,然后逐步扩展路径长度来逐步求解最短路径问题。

弗洛伊德算法是一种动态规划算法,通过构建一个关于各个顶点之间最短路径长度的矩阵来求解最短路径问题。

最短路径问题在实际生活中具有广泛应用,例如在地图导航中,我们需要找到从起点到目的地的最短路线;在网络通信中,我们需要找到网络中两个节点之间传输数据的最短路径。

在本篇文章中,我们介绍了关键路径和最短路径的概念,以及它们在实际问题中的应用。

关键路径用于确定项目完成所需的最短时间,而最短路径用于寻找连接两个顶点之间最短路线的问题。

这些概念都是数据结构中的重要内容,对于我们理解和解决实际问题具有重要意义。

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

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

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

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

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

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

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

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

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

一、需求分析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是具有相同特性的数据元素的集合,称为顶点集。

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

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

数据结构课程设计关键路径数据结构课程设计-关键路径#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,分别用于存放已确定最短路径的节点和待确定最短路径的节点。

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

数据结构课程设计-关键路径#define max 20#include<iostream>#include<stdio.h>#include<malloc.h>using 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<<"请输入图的顶点数目:"<<endl;//输入顶点数目cin>>G.vexnum;cout<<"请输入图的弧的数目:"<<endl;//输入弧的数目cin>>G.arcnum;cout<<"请确认是否输入弧的权值(y/n):"<<endl;cin>>tag;for(i=1;i<=G.vexnum;++i){G.vertices[i].data=i;//初始化顶点值G.vertices[i].firstarc=NULL;//初始化指针}cout<<"请输入弧的相关信息arc(V1-->V2)"<<endl;//构造弧for(k=1;k<=G.arcnum;++k){cout<<endl<<"请输入弧头"<<"[1,"<<G.vexnum<<"]:";cin>>i;cout<<"请输入弧尾"<<"[1,"<<G.vexnum<<"]:";cin>>j;while(i<1||i>G.vexnum||j<1||j>G.vexnum)//如果弧头或弧尾不合法,重新输入{cout<<endl<<"请再次输入弧头"<<"[1,"<<G.vexnum<<"]:";cin>>i;cout<<"请再次输入弧尾"<<"[1,"<<G.vexnum<<"]:";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<<"->";else cout<<G.vertices[j].data<<">";for(p=G.vertices[j].firstarc;p;p=p->nextarc)cout<<p->adjvex<<" "<<p->info<<" "<<p->adjvex<<"->"; cout<<endl;}}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<G.vexnum) //判断AOE是否网有回路{cout<<"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])vl[j]=vl[k]-r;}}//四,对活动的最早时间和最迟时间比较cout<<"============================================== ================"<<endl;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;elsecout<<" 不是关键活动"<<endl;}//for结束cout<<"============================================== ================"<<endl;length=ve[G.vexnum];cout<<endl<<"2.关键路径长度为:"<<endl;cout<<" "<<length<<endl;//路径长度等于图最后顶点的最早时间}int main()//主函数{ALGraph G;cout<<"=============================="<<endl;cout<<"======1.创建邻接表图=========="<<endl;cout<<"======2.输出邻接表图=========="<<endl;cout<<"======3.寻找关键活动=========="<<endl;cout<<"======4.退出=================="<<endl;cout<<"=============================="<<endl;cout<<"请选择操作:"<<endl;int a;l1:{cin>>a;}system("cls");while(a<=4){switch(a){case 1:cout<<"请正确创建邻接表图:"<<endl; CreateDG(G);cout<<"Create ALGraph success !"<<endl; cout<<"请选择操作:"<<endl;goto l1;break;case 2:cout<<"输出该邻接表图如下:"<<endl; cout<<"=================="<<endl; ShowMGraph(G);cout<<"该图输出完毕!"<<endl;cout<<"=================="<<endl; cout<<"请选择操作:"<<endl;goto l1;break;case 3:cout<<"1.输出关键活动如下:"<<endl; critical(G);cout<<"请选择操作:"<<endl;goto l1;break;case 4:return 0;}}return 0;}原文已完。

相关文档
最新文档