数据结构课程设计:拓扑排序和关键路径
数据结构的应用的拓扑排序与关键路径算法
数据结构的应用的拓扑排序与关键路径算法拓扑排序与关键路径算法是数据结构中重要的应用之一。
拓扑排序通过对有向图的节点进行排序,使得对于任意一条有向边(u,v),节点 u 在排序中都出现在节点 v 之前。
关键路径算法则是用来确定一个项目的关键活动和最短完成时间。
拓扑排序的实现可以通过深度优先搜索或者广度优先搜索来完成。
深度优先搜索是递归地访问节点的所有未访问过的邻居节点,直到没有未访问过的邻居节点为止,然后将该节点添加到拓扑排序的结果中。
广度优先搜索则是通过使用队列来实现的,将节点的邻居节点逐个入队并进行访问,直到队列为空为止。
无论使用哪种方法,拓扑排序都可以通过判断节点的入度来进行。
拓扑排序在很多实际问题中都有广泛应用。
比如在任务调度中,拓扑排序可以用来确定任务间的依赖关系和执行顺序;在编译原理中,拓扑排序可以用来确定程序中变量的定义和使用顺序。
关键路径算法用于确定项目中的关键活动和最短完成时间。
它通过计算每个活动的最早开始时间和最晚开始时间,以及每个活动的最早完成时间和最晚完成时间来实现。
具体步骤如下:1. 构建有向加权图,其中节点表示项目的活动,有向边表示活动间的先后关系,边的权重表示活动的持续时间。
2. 进行拓扑排序,确定活动的执行顺序。
3. 计算每个活动的最早开始时间,即从起始节点到该节点的最长路径。
4. 计算每个活动的最晚开始时间,即从终止节点到该节点的最长路径。
5. 根据每个活动的最早开始时间和最晚开始时间,可以确定关键活动,即最早开始时间与最晚开始时间相等的活动。
6. 计算整个项目的最短完成时间,即从起始节点到终止节点的最长路径。
拓扑排序与关键路径算法在工程管理、任务调度、生产流程优化等领域都有重要应用。
它们能够帮助我们有效地组织和管理复杂的项目,提高工作效率和资源利用率。
在实际应用中,我们可以借助计算机编程以及各种图算法库来实现这些算法,从而更快速、准确地解决实际问题。
综上所述,拓扑排序与关键路径算法是数据结构的重要应用之一。
数据结构课程设计
前一部分为郝斌视频简单记录,后一部分为ppt内容,郝斌讲过的后面ppt中不再重复int * pArr = (int *)malloc(sizeof(int) * len);不同的存储结构算法也不同泛型模块一:线性结构连续存储【数组】程序Arr 视频12,13 (首地址长度有效值的个数)优点存取速度快缺点插入删除元素很慢空间通常是有限制的需要大块连续的内存事先必须知道数组的长度离散存储【链表】1.定义n个节点离散分配/ 彼此通过指针相连/ 每个节点只有一个前驱节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点首节点(第一个有效节点)尾节点头结点(数据类型和首节点相同,第一个有效节点之前的节点,不存放有效数据,为了方便对链表的操作)头指针(指向头节点的指针变量)尾指针确定一个链表需要几个参数:只需要一个参数即头指针通过头指针可以推算出链表其他的所有信息(头结点可能占太多内存)Node 节点的生成节点的数据类型如何表示typedef struct Node{int data;//数据域struct Node * pNext;//指针域和结构体本身的类型相同}NODE, *PNODE;//NODE等价于struct Node ,PNODE等价于struct Node *2.分类单链表双链表每一个节点有两个指针域循环链表能通过任何一个节点能找到其他所有的节点非循环链表3.算法# include <stdio.h># include <malloc.h># include <stdlib.h>typedef struct Node{int data;struct Node * pNext;}NODE, *PNODE;//函数声明PNODE creat_list(void);void traverse_list(PNODE pHead);int main(void){PNODE pHead = NULL;pHead = creat_list();//creat_list() 功能:创建一个非循环单链表,并将该链表的首地址赋给pHeadtraverse_list(pHead);return 0;}PNODE creat_list(void){int len;int i;int val;//分配了一个不存放有效数据的头结点PNODE pHead = (PNODE)malloc(sizeof(NODE));if (NULL == pHead){printf("分配失败,退出程序!\n");exit(-1);}PNODE pTail = pHead;pTail->pNext = NULL;printf("请输入节点的个数: len = ");scanf("%d", &len);for (i=0; i<len; i++){printf("请输入第%d个节点的值:", i+1);scanf("%d", &val);PNODE pNew = (PNODE)malloc(sizeof(NODE));if (NULL == pNew){printf("分配失败,退出程序!\n");exit(-1);}pNew->data = val;pTail->pNext = pNew;//把每个新生成的节点挂到尾节点pTail上pNew->pNext = NULL;pTail = pNew;}return pHead;}void traverse_list(PNODE pHead){PNODE p = pHead->pNext;while (NULL != p){printf("%d ", p->data);p = p->pNext;}printf("\n");return;}遍历查找清空销毁求长度排序删除节点r = p->pnext;p->pnext = p->pnext->pnext;free(r); 注意不能直接free(p->pnext)否则第二个节点丢失,链会断开插入节点(头结点后面插入p所指向的那个节点)p->next = head->next;head->next = p;算法:狭义的算法是与数据的存储方式密切相关广义的算法是与数据的存储方式无关泛型:利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的即同一种逻辑结构,无论该逻辑结构物理存储是什么样子的我们都可以对它执行相同的操作可以利用c++中函数重载,来定义函数使其完成不同数据类型的操作的处理,即:++(){p = p->pNext; //链表,区别于数组可以直接进行++运算,但此时他们的操作是}4.优缺点优点没有空间限制插入删除元素很快缺点存取速度很慢,需进行遍历才能找到栈和队列是两种常用的数据类型线性结构两种常见的应用之一栈stack定义一种可以实现“先进后出”的存储结构Top Bottom/Base指针由栈顶元素指向栈底元素分类静态栈以数组为内核动态栈以链表为内核,相当于一个操作受限的链表算法出栈压栈应用函数调用中断表达式求值-----计算器,课本程序内存分配缓冲处理迷宫静态内存栈程序自动分配压栈出栈的方式分配内存都是分配内存的方式动态内存堆如malloc 程序员申请的堆排序的方式分配内存课本讲解的两个应用1数制转换2表达式求值(需要操作数栈和运算符栈(栈底为#))前缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;连续出现的两个操作数和在它们之前且紧靠它们的运算符构一个最小表达式;后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。
课设题目
数据结构课程设计题目1.八皇后问题设计要求:在棋盘上摆放八个皇后,使任意两个不在同一行,同一列,及同一对斜线上。
皇后的摆位任意,由用户设定,程序给出剩余皇后的摆位。
2.哈夫曼编/译码器;设计要求:针对字符集A及其各字符的频率值(可统计获得)给出其中给字符哈夫曼编码,并针对一段文本(定义在A上)进行编码和译码,实现一个哈夫曼编码/译码系统。
3.关键路径设计要求:对于任何大型工程项目(由若干小工程组成),求其关键路径。
4.最小生成树问题设计要求:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
5.最短路径问题设计要求:对给定有向图,设计图的存储结构,求出各顶点之间最短路径。
5.校园导航问题设计要求:设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
6.一元多项式的代数运算设计要求:计算任意两个一元多项式的加法、减法以及乘法。
7.算术表达式求值设计要求:将任意一个算术表达式转化为逆波兰表示,并根据逆波兰表示计算表达是的值。
8、运动会分数统计任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)要求:1).可以输入各个项目的前三名或前五名的成绩;2).能统计各学校总分,3).可以按学校编号、学校总分、男女团体总分排序输出;4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
9、订票系统任务:通过此系统可以实现如下功能:录入:可以录入航班情况查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
信息学奥赛一本通 第4章 第7节 拓扑排序与关键路径(C++版)
拓扑排序算法
【参考程序】 //gentree #include<cstdio> #include<iostream> using namespace std; int a[101][101],c[101],r[101],ans[101]; int i,j,tot,temp,num,n,m; int main() { freopen("gentree.in","r",stdin); freopen("gentree.out","w",stdout); cin >> n; for (i = 1; i <= n; i++) { do { cin >> j; if (j !=0 ) { c[i]++; //c[i]用来存点i的出度 a[i][c[i]] = j; r[j]++; //r[i]用来存点i的入度。 } } while (j != 0); }
拓扑排序算法
【数据规模】 80%的数据满足n<=1000,m<=2000;100%的数据满足n<=10000,m<=20000。 【算法分析】 首先构图,若存在条件“a的钱比b多”则从b引一条有向指向a;然后拓扑排序, 若无法完成排序则表示问题无解(存在圈);若可以得到完整的拓扑序列,则按序 列顺序进行递推: 设f[i]表示第i个人能拿的最少奖金数; 首先所有f[i]=100(题目中给定的最小值); 然后按照拓扑顺序考察每个点i,若存在有向边(j,i),则表示f[i]必须比f[j] 大,因此我们令f[i] = Max { f[i] , f[j]+1 }即可; 递推完成之后所有f[i]的值也就确定了,而答案就等于f[1]+…+f[n]。
拓扑排序及关键路径
2.有向图在实际问题中的应用 一个有向图可以表示一个施工流程图,或产品生产流程
图,或数据流图等。设图中每一条有向边表示两个子工程之 间的先后次序关系。
若以有向图中的顶点来表示活动,以有向边来表示活动 之间的先后次序关系,则这样的有向图称为顶点表示活动的 网 (Activity On Vertex Network),简称AOV网。
这样,每个活动允许的时间余量就是l(i) - e(i)。而关键活动 就是l(i) - e(i) = 0的那些活动,即可能的最早开始时间e(i)等于 允许的最晚开始时间l(i)的那些活动就是关键活动。
4.寻找关键活动的算法 求AOE网中关键活动的算法步骤为: (1)建立包含n+1个顶点、e条有向边的AOE网。其中,顶
(4)从汇点vn开始,令汇点vn的最晚发生时间vl[n]=ve[n], 按逆拓扑序列求其余各顶点k(k=n-1,n-2,…,2,1,0)的最晚发生 时间vl[k];
(5)计算每个活动的最早开始时间e[k] (k=1,2,3,…,e); (6)计算每个活动的最晚开始时间l[k] (k=1,2,3,…,e); (7)找出所有e[k]= l[k]的活动k,这些活动即为AOE网的 关键活动。
上述算法仅能得到有向图的一个拓扑序列。改进上述 算法,可以得到有向图的所有拓扑序列。
如果一个有向图存在一个拓扑序列,通常表示该有向 图对应的某个施工流程图的一种施工方案切实可行;而 如果一个有向图不存在一个拓扑序列,则说明该有向图 对应的某个施工流程图存在设计问题,不存在切实可行 的任何一种施工方案。
事件可能的最早开始时间υe(k):对于顶点υk代表的事件, υe(k)是从源点到该顶点的最大路径长度。在一个有n+1个事 件的AOE网中, 源点υ0的最早开始时间υe(0)等于0。事件υk (k=1,2,3,…,n)可能的最早开始时间υe(k)可用递推公式表 示为:
数据结构关键路径
数据结构关键路径 如果在有向⽆环图中⽤有向边表⽰⼀个⼯程中的各项活动(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 输⼊顶点数和边数,再输⼊每条边的起点编号、终点编号和权值。
《数据结构》教案.
教学内容纲要: 第7章 图 7.1 图的定义和术语 (1)图 (2)无向图: (3)有向图:(4)完全图: 7.2 图的存储结构 (1)邻接矩阵 (2)邻接表
1
课程名称:数据结构
总课序
授课 时间
课型 (教法)
多媒体讲授
课题
任课教师 撰写(修改) 讲课内容
7.2.3 — 7.3
《数据结构》教案
广西民族大学数学与计算机学院
课程名称:数据结构
总课序
授课 时间
课型 (教法)
多媒体讲授
课题教具 准备教学 的掌握图的基本概念 掌握图的存储结构
任课教师 撰写(修改) 讲课内容
7.1—7.2.2
图的基本概念、存储结构
教学 重点
教学 难点 与关键
基本概念 图的邻接矩阵存储和邻接表存储
1.拓扑排序 2.关键路径、 7.6 最短路径
4
图的存储结构及遍历
教具 准备
教学 目的
掌握图的遍历 理解图的十字链表和邻接多重表存储结构:
教学 重点
图的深度优先遍历和广度优先遍历
教学 难点 与关键
图的深度优先遍历和广度优先遍历
教学内容纲要: 第7章 图 7.2 图的存储结构 3.十字链表 4.邻接多重表
7.3 图的遍历 1.深度优先遍历 2.广度优先遍历
2
课程名称:数据结构
总课序
授课 时间
课型 (教法)
多媒体讲授
任课教师 撰写(修改) 讲课内容
7.3 —7.4.3
课题
图的生成树、最小生成树
教具 准备
教学 目的
掌握生成树、最小生成树的相关问题
教学 重点
最小生成树的生成
数据结构-chap7 (4)AOV网与拓扑排序
}//for }//while if (count<G.vexnum) return ERROR; //该有向图有回路 else return OK; }//TopologicalSort
自测题2 AOV-网的拓扑排序
v2 v1 v3 v4 v5 v6 v1 v2
1
3 0 1 0 3 S.top S.base
5 4
1
2 3
3
2 1 4 0 2
C2
1
0
5 0
1
4
5
C3
C4
C5
C3 0 C4
5 0
C5 0
while(! StackEmpty(S)){ Pop(S, i); printf(i, G. vertices[i].data); ++count; for (p=G.vertices[i].firstarc; p; p=p->nextarc) { k = p->adjvex; if ( !(- -indegree[k]) ) Push(S, k); }//for }//while data firstarc C0 1 3 0 栈S C1 5 0
Status TopologicalSort(ALGraph G) { FindInDegree(G, indegree); //求各顶点入度indegree[0..vexnum-1] InitStack(S); for(i=0; i<G. vexnum; ++i) if (! indegree[i]) Push(S, i); //入度为0顶点的编号进栈 count = 0; //对输出顶点计数 count=6 while(! StackEmpty(S)){ Pop(S, i); //从零入度顶点栈S 栈顶,获得一入度为零的顶点i printf(i, G. vertices[i].data); ++count; //输出i号顶点的数据,并计数 for (p=G. vertices[i]. firstarc; p; p=p->nextarc) { k = p->adjvex; if ( !(- -indegree[k]) ) Push(S, k); //对i号顶点邻接到的 每个顶点入度减1
课次21——第七章03拓扑排序和关键路径
对有向图进行如下操作:按照有向图给出的次序关系,将图 中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶 点,则可以人为加上任意的次序关系。由此所得顶点的线性序列 称之为拓扑有序序列。
v3 v5
v9
v8
v4
v6
13 2020/8/4
7.5.2 关键路径(4)
在AOE网络中, 有些活动顺序进行,有些活动并行进行。
从源点到各个顶点,以至从源点到汇点的有向路径可能不止 一条。这些路径的长度也可能不同。完成不同路径的活动所 需的时间虽然不同,但只有各条路径上所有活动都完成了, 整个工程才算完成。
例:
C0
C1
C2
C0
C1
C2
C3
C4
C5
(a) 有向无环图
C0
C1
C2
C3
C4
C5
(b) 输出C4
C1
C2
C3
C5
(c) 输出顶点C0
9 2020/8/4
C3
C5
(d) 输出顶点C3
7.5.1拓扑排序(Topological Sort)(7)
C1
C2
C1
C5 (e) 输出顶点C2
C5 (f) 输出顶点C1
因此,完成整个工程所需的时间取决于从源点到汇点的最长 路径长度,即在这条路径上所有活动的持续时间之和。这条 路径长度最长的路径就叫做关键路径(Critical Path)。
子工程所需时间。 问:哪些子工程是“关键工程”? 即:哪些子工程将影响整个工程的完成期限的。
首先了解一些基本概念:
《数据结构与算法》AOE网及关键路径
基本概念:
AOE网:带权的有向图,其中,顶点表示事件,弧表示活 动,权表示活动持续的时间。
关键路径:AOE-网中有些活动可以并行的进行,所以完 成工程的最短时间是从开始点到完成点的最长路径的 长度(这里所说的长度是指路径上各个活动持续时间 之和,不是路径上弧的数目)。路径长度最长的路径 叫做关键路径。
a5=1 7
v9 a8=7
v8 a11=4
a3=5
4
v4 a6=2
5
a9=4 11
v6
7
从ve(0)=0开始向后推.
Ve(j)=Max{ve(i)+dut(〈i,j〉)}
(j=1,2….n-1)
1 求活动最迟发生时间 6
a1=6 v2 a4=1
16v7
a7=9
a10=2 18
v9
0 v1 a2=4
a6=12
4 a5=7 6
el a1 0 0 a2 5 5 a3 0 7 a4 0 7 a5 9 16 a6 23 23 a7 15 15 a8 15 15 a9 5 5 a10 27 27 a11 27 27 a12 35 35 a13 41 41
v5 a8=7
v3 a5=1 7
v8 a11=4
a3=5
6
v4
8 a6=2
a9=4 14
v6
10
从vl(9)=18开始向回推(倒计时)。 Ve(i)=Min{vl(j)- dut(〈i,j〉)}
(j=n-2,n-3,----,0)
例: 对下面的AOE网络,试回答下列问题: ve vl
(1)列出所有的关键路径; (2)完成整个工程至少需要多少时间?
最早发生时间:假设开始点是V1,从V1到Vi的最长的路径 的长度叫做事件Vi的最早发生时间。
数据结构与算法—关键路径
关键路径若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续时间),则此带权的有向图称为边表示活动的网(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) 。
信息学奥赛一本通 第4章 第7节 拓扑排序与关键路径(C++版)
拓扑排序算法
【例4-13】奖金 【问题描述】 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理 Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准 来计算他们得到奖金的多少。于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出 了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案, 满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。 【输入格式】 第一行两个整数n,m,表示员工总数和代表数;以下m行,每行2个整数a,b,表 示某个代表认为第a号员工奖金应该比第b号员工高。 【输出格式】 若无法找到合理方案,则输出“Poor Xed”;否则输出一个数表示最少总奖金。 【输入样例】 2 1 1 2 【输出样例】 201
4
3
上图就是一个出现环产生自相矛盾的情况。4是1的前驱,想完成1,必 须先完成4。3是4的前驱,而2是3的前驱,1又是2的前驱。最后造成想完成 1,必须先完成1本身,这显然出现了矛盾。
拓扑排序算法
拓扑排序算法,只适用于AOV网(有向无环图)。 把AOV网中的所有活动排成一个序列, 使得每个活动的所有前驱活动都排在该 活动的前面,这个过程称为“拓扑排序”,所得到的活动序列称为“拓扑序列”。 一个AOV网的拓扑序列是不唯一的,例如下面的这张图,它的拓扑序列可以是: ABCDE,也可以是ACBDE,或是ADBCE。在下图所示的AOV网中,工程B和工程 C显然可以同时进行,先后无所谓;但工程E却要等工程B、C、D都完成以后才能进 行。 B C A D 构造拓扑序列可以帮助我们合理安排一个工程的进度,由AOV网构造拓扑序 列具有很高的实际应用价值。 算法思想: 构造拓扑序列的拓扑排序算法思想很简单: 选择一个入度为0的顶点并输出 然后从AOV网中删除此顶点及以此顶点为起点的所有关联边; 重复上述两步,直到不存在入度为0的顶点为止。 若输出的顶点数小于AOV网中的顶点数,则输出“有回路信息”,否则输出 的顶点序列就是一种拓扑序列 从第四步可以看出,拓扑排序可以用来判断一个有向图是否有环。只有有 向无环图才存在拓扑序列。 E
详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)1.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树1.1 问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。
这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?1.2 分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。
即无向连通图的生成树不是唯一的。
连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。
图G5无向连通图的生成树为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n 个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1 条边。
1.3最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。
最小生成树的性质:假设N=(V,{ E}) 是个连通网,U是顶点集合V的一个非空子集,若(u,v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。
1.4 解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。
他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。
时间复杂度O(N^2)假设G=(V,E)为连通图,其中V 为网图中所有顶点的集合,E 为网图中所有带权边的集合。
C++实现关键路径算法课程设计报告
有向图的关键路径计算机与软件工程学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码: 题目:年级/专业/班:学生姓名: 学号:开始时间:2013 年 12 月18 日完成时间:2013 年12月 28 日课程设计成绩:学习态度及平时成绩(20)技术水平与实际能力(20)完成情况(20)创新(5)说明书(计算书、图纸、分析报告)撰写质量(35)总分(100)指导教师签名:年月日目录引言 (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网;关键路径;有向图的关键路径引言工程有很多的阶段,这些阶段之间有一定的先后关系和自己的时间。
我们可以用图来表示工程,将其输入程序中,可以用程序计算出工程的相关信息,如,工程完成的最短时间,哪些活动会影响工程的进度等。
要解决这些问题就可以用领接表储存图,并计算各个事件和各个阶段的最早发生时间和最晚发生时间,得到关键活动,从而的到关键路径。
拓扑排序与关键路径分析
拓扑排序与关键路径分析拓扑排序和关键路径分析是项目管理和图论中常用的两种技术,用于分析和优化活动的执行顺序。
在本文中,我们将探讨这两种技术的原理、应用和实施方法。
一、拓扑排序拓扑排序是一种用于有向无环图(DAG)的节点排序方法,使得图中的每条边的起始节点都排在终止节点的前面。
在拓扑排序中,节点表示活动,边表示活动间的先后关系。
拓扑排序的实现可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来完成。
DFS方式会将所有可能的路径都遍历一遍,直到没有后续节点为止。
而BFS方式通过从源节点开始,按广度优先的顺序依次处理各个节点,直到所有节点处理完毕。
拓扑排序在项目管理中被广泛应用,用于确定活动执行的先后顺序,确保项目按计划有序地进行。
通过拓扑排序,可以发现项目中的关键路径,进而对项目进行合理的资源分配和时间安排。
二、关键路径分析关键路径分析是项目管理中用于确定项目完成所需的最短时间的方法。
关键路径是指项目中的一条从起始节点到结束节点的路径,其上的活动紧密相连且没有松弛时间,任何活动的延误都会导致整个项目的延误。
关键路径分析需要确定每个活动的最早开始时间、最晚开始时间、最早完成时间和最晚完成时间。
通过计算差异,可以找到关键路径上的活动和总体项目的最短完成时间。
关键路径分析在项目管理中对决策和资源管理具有重要意义。
通过确定关键路径,项目经理可以对重要活动进行优化和调整,以确保项目按时完成。
此外,关键路径还可以用于资源的分配和调度,以提高项目的效率和质量。
三、拓扑排序与关键路径分析的实施方法要实施拓扑排序和关键路径分析,需要按照以下步骤进行:1. 确定项目的活动和其间的依赖关系。
将活动表示为节点,依赖关系表示为边。
2. 使用拓扑排序算法,对活动进行排序,得到一个合理的活动执行顺序。
3. 计算每个活动的最早开始时间、最晚开始时间、最早完成时间和最晚完成时间。
4. 根据计算结果,找到关键路径上的活动,确定项目的最短完成时间。
数据结构:第7章 图4-拓扑排序和关键路径
拓扑排序算法
拓扑排序方法: (1)在AOV网中选一个入度为0的顶点(没有前驱) 且输出之; (2)从AOV网中删除此顶点及该顶点发出来的所 有有向边; (3)重复(1)、(2)两步,直到AOV网中所有 顶点都被输出或网中不存在入度为0的顶点。
从拓扑排序步骤可知,若在第3步中,网中所有顶 点都被输出,则表明网中无有向环,拓扑排序成功。 若仅输出部分顶点,网中已不存在入度为0的顶点, 则表明网中有有向环,拓扑排序不成功。
拓扑序列:C1--C2--C3 (3)
C12 C9 C10
C7 C8 C6
C11
拓扑序列:C1--C2--C3--C4 (4)
C7
C12
C12
C8
C8 C9 C10
C6
C9 C10
C6
C11
C11 拓扑序列:C1--C2--C3--C4--C5
(5)
拓扑序列:C1--C2--C3--C4--C5--C7 (6)
在 (b)中,我们用一种有向图来表示课程开设
拓扑排序
1.定义 给出有向图G=(V,E),对于V中的顶点的线性序列 (vi1,vi2,...,vin),如果满足如下条件:若在G中从 顶点 vi 到vj有一条路径,则在序列中顶点vi必在 顶点 vj之前;则称该序列为 G的一个拓扑序列。 构造有向图的一个拓扑序列的过程称为拓扑排序。 2.说明 (1)在AOV网中,若不存在回路,则所有活动可排成 一个线性序列,使得每个活动的所有前驱活动都排 在该活动的前面,那么该序列为拓扑序列. (2)拓扑序列不是唯一的.
2.AOV网实际意义
现代化管理中, 通常我们把计划、施工过程、生产流程、 程序流程等都当成一个工程,一个大的工程常常被划分 成许多较小的子工程,这些子工程称为活动。在整个工 程实施过程中,有些活动开始是以它的所有前序活动的 结束为先决条件的,必须在其它有关活动完成之后才能 开始,有些活动没有先决条件,可以 安排在任意时间开 始。AOV网就是一种可以形象地反映出整个工程中各个 活动之间前后关系的有向图。例如,计算机专业学生的 课程开设可看成是一个工程,每一门课程就是工程中的 活动,下页图给出了若干门所开设的课程,其中有些课 程的开设有先后关系,有些则没有先后关系,有先后关 系的课程必须按先后关系开设,如开设数据结构课程之 前必须先学完程序设计基础及离散数学,而开设离散数 学则必须先并行学完数学、程序设计基础课程。
关键路径(CriticalPath)
关键路径(CriticalPath)引⼊拓扑排序主要是为解决⼀个⼯程能否顺序进⾏的问题,但有时还需要解决⼯程完成需要的最短时间问题。
这时仅仅是拓扑排序是不够的。
通过拓扑排序,可以有效地分析出⼀个有向图是否存在环;若不存在,那它的拓扑排序是什么?另⼀⽅⾯,利⽤求关键路径的算法,可以得到完成⼯程的最短⼯期及关键活动有哪些。
(摘⾃《⼤话数据结构》)定义事件:开始XX事情 | 完成XX事情活动:做XX事情源点:某流程的开始汇点:某流程的结束AOE⽹:在⼀个表⽰⼯程的带权有向图中,⽤顶点表⽰事件,⽤有向边表⽰活动,⽤边上的权值表⽰活动的持续时间,这种有向图的边表⽰活动的⽹,我们称之为AOE⽹(Activity On Edge Network)。
把路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最⼤长度的路径叫关键路径,在关键路径上的活动叫关键活动。
(摘⾃《⼤话数据结构》)事件是⼀个点,活动是⼀条线。
举例以炒⼀盘⾁作为⽰例:将炒⼀盘⾁⽐作⼀个⼯程。
⼀位⼤⼈负责厨房的事情,⼀位⼩孩负责从院⼦⾥摘菜并送到厨房。
⼩孩从院⼦⾥摘菜并送到厨房需要1.5分钟。
⼤⼈准备⾁需要7分钟;准备菜需要1.5分钟;炒⾁需要2分钟;炒菜需要1分钟。
问题:这项⼯程的最短时间为多少?显然,该⼯程的流程不是这样:摘菜送到厨房(1.5分钟)->准备⾁(7分钟)->准备菜(1.5分钟)->炒⾁(2分钟)->炒菜(1分钟),共13分钟。
因为⼩孩摘菜的同时⼤⼈可以准备⾁;在炒⾁的后⾯阶段可以将菜放⼊锅⾥⼀起炒,这也符合⽇常实践。
⽽准备菜这个活动⼜受到“摘菜并送到厨房”和“准备⾁”这两个活动的制约:先有菜才能对菜进⾏处理!先处理好⾁才能处理菜吧,厨房⾥只有⼀个⼈。
⽤前⾯的“事件”、“活动”、“源点”和“汇点”来表⽰这个⼯程。
源点:开始准备⾁/开始摘菜送到厨房汇点:完成炒菜/完成炒⾁事件:开始摘菜并送到厨房>完成摘菜并送到厨房开始准备⾁>完成准备⾁开始准备菜>完成准备菜开始炒⾁>完成炒⾁开始炒菜>完成炒菜约束条件:“完成准备⾁”和“完成摘菜并送到厨房”才能“开始准备菜”。
计算机专业《数据结构》教学大纲
计算机专业《数据结构》教学大纲一、课程基本信息课程名称:数据结构课程类别:专业基础课课程学分:X学分课程总学时:X学时适用专业:计算机专业二、课程的性质、目的和任务(一)课程性质《数据结构》是计算机专业的一门重要的专业基础课,它是介于数学、计算机硬件和计算机软件之间的一门核心课程,不仅是程序设计的基础,也是设计和实现操作系统、数据库系统、编译系统及其他系统程序和大型应用程序的重要基础。
(二)课程目的通过本课程的学习,使学生能够掌握数据结构的基本概念、基本原理和基本算法,培养学生分析问题和解决问题的能力,为后续课程的学习和今后从事软件开发工作打下坚实的基础。
(三)课程任务1、使学生掌握数据结构的基本概念和术语,包括数据、数据元素、数据对象、数据结构等。
2、使学生掌握线性表、栈、队列、串、数组、广义表、树、图等常用数据结构的逻辑结构、存储结构和基本操作的实现算法。
3、使学生掌握查找和排序的基本算法,包括顺序查找、二分查找、哈希查找、插入排序、选择排序、交换排序、归并排序等。
4、培养学生运用所学数据结构和算法知识解决实际问题的能力,能够根据具体问题选择合适的数据结构和算法,并进行算法设计和程序实现。
5、培养学生的程序设计能力和良好的编程风格,提高学生的代码可读性和可维护性。
三、课程教学内容和要求(一)绪论1、教学内容数据结构的基本概念和术语,包括数据、数据元素、数据对象、数据结构、数据类型等。
数据结构的研究内容和研究方法。
算法的基本概念和特性,包括有穷性、确定性、可行性、输入和输出。
算法的描述方法,包括自然语言描述、流程图描述、伪代码描述等。
算法的分析方法,包括时间复杂度和空间复杂度的分析。
2、教学要求理解数据结构的基本概念和术语。
了解数据结构的研究内容和研究方法。
掌握算法的基本概念和特性。
掌握算法的描述方法。
掌握算法的时间复杂度和空间复杂度的分析方法。
(二)线性表1、教学内容线性表的定义和逻辑结构。
数据结构课程设计——拓扑排序
. . .. . .课程设计任务书学生:专业班级:指导教师:工作单位:计算机科学系题目: 拓扑排序初始条件:(1)采用邻接表作为有向图的存储结构;(2)给出所有可能的拓扑序列。
(3)测试用例见严蔚敏《数据结构习题集(C语言版)》p48题7.9图要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下容:1. 问题描述简述题目要解决的问题是什么。
2. 设计存储结构设计、主要算法设计(用类C/C++语言或用框图描述)、测试用例设计;3. 调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4. 经验和体会(包括对算法改进的设想)5. 附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出。
说明:1. 设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
2. 凡拷贝往年任务书或课程设计充数者,成绩一律无效,以0分记。
时间安排:1.第17周完成,验收时间由指导教师指定2.验收地点:实验中心3.验收容:可执行程序与源代码、课程设计报告书。
指导教师签名:2013年6月14日系主任(或责任教师)签名:年月日拓扑排序目录1问题描述2具体设计2.1存储结构设计2.2主要算法设计2.2.1拓扑排序的算法总体设计2.2.2将有向图表示为邻接表2.2.3拓扑排序函数的设计2.2.4顺序表的运算设计2.3测试用例设计3调试报告3.1设计和编码的分析3.2调试过程问题及解决4经验与体会5用户使用说明6参考文献7附录源代码与运行结果1问题描述题目:拓扑排序如果用有向图表示一个工程,在这种有向图中,用顶点表示活动,用有向边<vi,vj>表示活动vi必须先于活动vj进行,这种有向图叫做顶点表示活动的网络,记作AOV 网络。
对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得AOV网络中的所有应存在前驱和后继的关系都能得到满足,这种构造AOV网络全部顶点的拓扑有序序列的运算叫做拓扑排序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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就应运而生了。
对于一个项目而言,只有项目网络中最长的或耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径(Critical Path),组成关键路径的活动称为关键活动。
2.1.2关键路径特点关键路径上的活动持续时间决定了项目的工期,关键路径上所有活动的持续时间总和就是项目的工期。
关键路径上的任何一个活动都是关键活动,其中任何一个活动的延迟都会导致整个项目完工时间的延迟。
关键路径上的耗时是可以完工的最短时间量,若缩短关键路径的总耗时,会缩短项目工期;反之,则会延长整个项目的总工期。
但是如果缩短非关键路径上的各个活动所需要的时间,也不至于影响工程的完工时间。
关键路径上活动是总时差最小的活动,改变其中某个活动的耗时,可能使关键路径发生变化。
可以存在多条关键路径,它们各自的时间总量肯定相等,即可完工的总工期。
关键路径是相对的,也可以是变化的。
在采取一定的技术组织措施之后,关键路径有可能变为非关键路径,而非关键路径也有可能变为关键路径。
2.2关键路径实现过程2.2.1结构选取首先要选取建图的一种算法建立图,有邻接矩阵,邻接表,十字链表,邻接多重表等多种方法,要选取一种适当的方法建立图,才能提高算法效率,降低时间复杂度和空间复杂度。
两个相邻顶点与它们之间的边表示活动,边上的数字表示活动延续的时间。
对于给出的事件AOE网络,要求求出从起点到终点的所有路径,经分析、比较后找出长读最大的路径,从而得出求关键路径的算法,并给出计算机上机实现的源程序。
完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。
2.2.2具体要解决的问题(1)将项目中的各项活动视为有一个时间属性的结点,从项目起点到终点进行排列;(2)用有方向的线段标出各结点的紧前活动和紧后活动的关系,使之成为一个有方向的网络图;(3)用正推法和逆推法计算出各个活动的最早开始时间,最晚开始时间,最早完工时间和最迟完工时间,并计算出各个活动的时差;(4)找出所有时差为零的活动所组成的路线,即为关键路径;(5)识别出准关键路径,为网络优化提供约束条件;2.2.3算法分析(1)求关键路径必须在拓扑排序的前提下进行,有环图不能求关键路径;(2)只有缩短关键活动的工期才有可能缩短工期;(3)若一个关键活动不在所有的关键路径上,减少它并不能减少工期;(4)只有在不改变关键路径的前提下,缩短关键活动才能缩短整个工期。
(5)关键路径:从源点到汇点的路径长度最长的路径叫关键路径。
(6)活动的最早开始时间e(i);(7)活动的最晚开始时间l(i);(8)定义e(i)=l(i)的活动叫关键活动;(9)事件的最早开始时间ve(i);(10)事件的最晚开始时间vl(i)。
设活动ai由弧<j,k>(即从顶点j到k)表示,其持续时间记为dut(<j,k>),则:e(i)=ve(j)l(i)=vl(k)-dut(<j,k>)求ve(i)和vl(j)分两步:1.从ve(1)=0开始向前递推ve(j)=Max{ ve(i)+dut(<i,j>) }<i,j>T, 2<=j<=n其中,T是所有以j为弧头的弧的集合。
2.从vl(n)=ve(n)开始向后递推vl(i)=Min{ vl(j)-dut(<i,j>) }<i,j>S, 1<=i<=n-1其中,S是所有以i为弧尾的弧的集合。
两个公式是在拓扑有序和逆拓扑有序的前提下进行。
2.2.4 算法步骤(1)输入e条弧<j,k>,建立AOE网的存储结构。
(2)从源点v1出发,令ve(1)=0,求个点的最早开始时间ve(j)。
(3)从汇点vn出发,令vl(n)=最大值,求个点的最晚开始时间vl(j)。
(4)由于各结点的最早开始时间已求出来,所以各活动的最早开始时间即(每条弧s(活动)的最早开始时间)就等于该结点的最早开始时间,并由上可同时求出该活动的最晚开始时间l(j)。
(5)具体表达式为:e(i)=ve(j)l(i)=vl(k)-dut(<j,k>)(6)当结点的最早开始时间ve(j)=最晚开始时间时vl(j),则该结点为关键结点。
(7)当活动的最早开始时间e(j)=最晚开始时间时l(j),则该结点为关键活动。
3 主要功能模块设计3.1程序模块栈部分模块Status InitStack(SqStack &S) //初始化栈Status DestroyStack(SqStack &S)//销毁栈Status ClearStack(SqStack &S)//清空栈Status StackEmpty(SqStack S)//判断是否为空Status StackEmpty(SqStack S)//判断是否为空Status Pop(SqStack &S,SElemType &e) //弹出元素Status GetElement(SqStack &S,int position,SElemType &e) //取元素,非弹出,i为要去元素位置无向图(AOE网)部分模块void CreateALGraph(ALGraph &graph)//初始化AOE网Status TopologicalSort(ALGraph &graph,SqStack &ToPoReverseSort) //求拓扑排序Status PutInfoToPoSort(SqStack temp,ALGraph graph) //输出拓扑顺序排序(当拓扑序列存在时)Status GetVeAndVl(ALGraph &graph,SqStack OrderSort,SqStack RevSort) //求出结点和活动的最晚开始时间和最早开始时间Status CriticalPath(ALGraph &graph,SqStack RevSort) //求出关键活动和关键事件并输出4 系统详细设计4.1主函数模块main函数首先调用SqStack ToPoSort;SqStack ToPoReverseSort;函数来定义栈,调用InitStack(ToPoSort);来初始化存拓扑排序的栈和InitStack(ToPoReverseSort);来初始化逆拓扑排序的栈。
其次调用CreateALGraph(ALGraph &graph)函数定义和初始化AOE网,调用TopologicalSor t(ALGraph &graph,SqStack &ToPoReverseSort) 函数求拓扑序列和调用PutInfoToPoSort(ToPoSort,graph);函数来输出输出拓扑顺序排序。
然后调用GetVeAndVl(graph,ToPoSort,ToPoReverseSort) 函数求结点和活动的最晚开始时间、最早开始时间并输出。
最后调用Status CriticalPath(ALGraph &graph,SqStack RevSort)函数来求关键活动、关键事件并输出。
4.2初始化模块初始化模块用来初始化图,要求用户自己输入数据,并程序构造AOE网。
本程序是用自己改进的邻接表来构造AOE网。
见图2-4-2图2-4-2图2-4-34.3求拓扑序列模块利用栈来存储入度为零的结点,然后逐个弹出,来进行与该结点的出度结点来比较,是否符合拓扑排序的规则,最后用ToPoReverseSort存放拓扑逆序序列来完成整个拓扑排序。
见图2-4-34.4求最晚开始时间和最早开始时间模块(包括结点和活动的最早和最晚开始时间)见图2-4-4图2-4-44.5关键活动和关键事件见图2-4-5N图2-4-54.6输出模块输出相应结点的信息,拓扑序列,以及事件的最早开始时间和最晚开始时间,输出相应的活动的最早开始时间和最晚开始时间,关键活动以及关键事件。
5 测试分析5.1测试内容求的关键路径为:程序输入部分:求拓扑序列部分求结点和活动的最早开始时间和最晚开始时间输出图中的关键事件和关键活动(关键路径)测试关键路径结果:5.2回路测试结果分析:结果完全符合所求,但是输出的方面不够完美,并且自我感觉程序所使用的空间比较大,算法复杂度较高,所以效率比较低下,当程序输入存在有环的时候,程序没有发生任何错误,直接输出“图存在有环”然后退出程序。
由此可见本程序计划实施到完工比较顺利的完成了,并且在程序测试中能够得到预期的结果出来,不过唯一不满意的是程序过于复杂化,使用的太多的空间,致使程序成为一个缺陷。
参考文献[1]严蔚敏,吴伟民.数据结构. 北京:清华大学出版社,2006.[2]谭浩强. C程序设计(第二版)作者:清华大学出版社,2006心得体会经历几天的编程之后,课程设计终于结束了。