aov网的拓扑序列生成-数据结构与算法课程设计报告.doc.docxVIP

aov网的拓扑序列生成-数据结构与算法课程设计报告.doc.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
题目:AOV网的拓扑序列生成 一、问题分析和任务定义 本次课程设计要求对于给泄的AOV网求岀它所有拓扑序列。AOV网(Activity on Vertex Network)是一个有向无环图(Directed Acycline Graphs DAG图)。AOV网中,如果顶点 V:表示的活动在和顶点V」表示的活动之前进行,则称V’是比的前驱顶点,也是也后继顶点。 拓扑排序就是将有向无环图中的各个顶点排成一个序列,使得所有的前去后继关系都得到满 足。对于相互之间没有次序关系的顶点,在拓扑排序的序列中可以处在任意的位置。因此, 拓扑排序的结果往往是不唯一的。本次课程设计的主要任务就是将给泄的一个AOY网输出所 有的该种序列。下而以图一为例: 图一 一种AOV网 对于该图其所有的拓扑序列如下: 、VO VI V2 V3 V4 、VO VI V2 V4 V3 、VI VO V2 V3 V4 、VI VO V2 V4 V3 二、数据结构的选择和概要设计 对于给出的AOV网首先要确左它的存储方式,这里选择邻接表,它的具体数据结构如 下图二所示: typedef struct node{ int number; struct node *next; int info; }ListNode; typedef struct{ int number; ListNode *firstarc; }AdjList; typedef struct{ AdjList head[max_vertex. int vexnum , edgnum; //邻接表中的结点类型 〃结点编号 //指向下一个结点 //与表头结点边的信息 //迫义表头结点数组 //顶点信息 //指向第一个邻接点 //表头结点类型 //邻接表类型 〃邻接表的组 〃顶点个数.边的个数 、:ALGraph; 图二图的数据结构 一种拓扑序列的生成一般有一下步骤: 、从有向无环图中选择一个没有前驱结点的顶点并加入到结点的序列中: 、从有向无环图中删除该顶点以及该顶点为尾的所有的弧: 、重复<1) (2)的步骤。 在整个拓扑排序的过程中需要频繁的检查顶点的前驱以及作删除顶点和弧的操作,在这 里我们用两个全局变量rudu[max_vertex_num]和visited[max_vertex_numJ来分别实现这 两个操作,如果ruduEi]为零则表示无前驱结点,如果visitedEi]为零则表示没有被访问过。 如果每删除一个结点就检查,那样的话时间复杂度将很大(等于遍历所有的顶点一遍),因 此设il?一个堆栈,把检测到的入度为零的结点入栈。每次删除顶点只要从栈中取岀一个结点 即可。这里堆栈也有一个数据结构,具体实现如图三所示: 栈顶兀素亡op 、堆挨数组 i nt dat a [m r t ex ] 图三 栈的数据結构 typedef struct{ int data .max_vertex_num] ; //堆栈数组 int top;//栈顶标志 } Stack; 〃顺序表类型 但是如果需要实现一个A0V网所有拓扑序列的生成则不止如此。在每找到一个符合要求 的结点后入栈,从而实现一种拓扑排序。在一趟拓扑排序结朿后,应该进行恢复删除的结点 和删除的弧,并标记已经有过的序列,在恢复某几个个结点后进行下一次的拓扑排序。这里 用到递归的思想。具体实现见下面的详细设计。 三、详细设计和编码 本次课程设计的重点在于输出A0V网的所有拓扑序列,因此图的创建即输出之类的问 题不做为重点,在此设计过程略过。 对于拓扑排序算法流程图如图四所示: 图四一趙拓扑排序法程蔺 实现该算法的具体编码如下: void topusort (Stack *L, ALGraph *G, int i) {//拓扑排序 ListNode *P; int j,k;Soutput(L); Sinsert (L, i) ; //把顶点Vi加入到栈中 P二G-head[i]. firstarc; visited[i]二1; //把排序过的点标记 while (P) { j=P-number; rudu[j]-; 〃把以Vi为头的终止结点入度减1 P=P-next; } if (L-top+l==G-vexnum) {//判断栈中一种拓扑排序完成 Soutput(L); printf(\n); flag++; } for (k=0; kG-vexnum; k++) // 调用部分 if ((visit ed[k]=0)(rudu[k]=0))//如果Vk在此轮中未被访问过且入度为0 topusort (L, G, k); visited[i]二0; //使Vi恢复为未访问 P二G-head[i]. firstarc; while(P) { j=P-numbe

文档评论(0)

yuxiufeng + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档