- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AOV网的所有拓扑排序的生成
一、问题分析和任务定义
题目:对给定的AOV网,给出它所有的拓扑排序。
AOV网是一个有向无环图,拓扑排序就是将有向无环图中的各个顶点排成一个序列,使得所有的前驱后继关系都得到满足。对于相互之间没有次序关系的顶点,在拓扑排序中可以处在任意的位置。因此,拓扑排序的结果往往不是唯一的。
V1
V2
V4
V3
图一
对图一进行拓扑排序,就可以得到:V1,V3,V2,V4和V3,V1,V2,V4.二个拓扑排序。
所以对有向无环图要求输出它所有的拓扑排序,对于非有向无环图要输出它不能进行拓扑排序。网中所有顶点都被输出,则表明网中无有向环,拓扑排序成功。若仅输出部分顶点,网中已不存在入度为0的顶点,则表明网中有有向环,拓扑排序不成功。
测试用例:
V11
V2
V3
V4
图二
图二中存在回路
V1
V2
V5
V3
V4
图三
图三为有向无环图
所以正确的测试结果应该是图二无法进行拓扑排序,而图三则输出它所有的拓扑排序序列。
二、数据结构的选择和概要设计
我选择邻接表的结构来存储图。
首先,拓扑排序可以分为三步:1、从有向无环图中选择一个没有前驱的顶点并加入到结果序列中。2、从有向无环图中删除该顶点以及以该顶点为尾的所有弧。3、重复1、2两步,直到所有的顶点都加入到结果序列中。
其次,从描述的拓扑排序的步骤可以看出,在整个排序过程中需要频繁的检查顶点的前驱以及作删除顶点和弧的操作,因此可以采用邻接表作为有向无环图的存储结构。
最后,为了快速的判断顶点是否有前驱,可以在表头中增加一个“入度域”用来指示顶点当前的入度。当入度为0时,表明该顶点没有前驱,可以加入到结果序列中。而删除顶点及以它为尾的弧的操作,可以通过该顶点的所有邻接点的入度域减一来完成。要求输出所有拓扑排序。
所以开始定义一个整型变量flag等于0和一个全局整型变量k等于max,,二个数组show[],visited[]。使所有visited[i]=0,表示图中所有顶点未被访问过如果flag等于0,则表示所有的顶点都入数组show[],输出排序结果。如果存在未被访问过且入度为0的顶点,则k等于0,若未被访问过的结点入度都不为0,则图中必存在回路,不能进行拓扑排序,使k等于1。
对于未访问过且入度为0的结点 i,将i存入数组show[]中,并使visited[i]=1.
再定义数组r[],将i的所有邻接点存入r[], 便于恢复图的各条边,并将它所有的邻接点的入度减一。然后递归调用拓扑排序,对下一个结点进行排序。恢复图的各条边,将r[]中的顶点入度加一。
有向无环图的所有的拓扑排序的大概设计思想如下:
void Topusort(ALgraphG, int n) //正在对图G中第i个结点进行排序
{
if(G为空)
输出队列中的排序结果
else
{
if ( G不存在入度为0的节点 )
{
图G存在回路,无法拓扑排序
}
else
{
for (G中每个入度为0的节点v)
{
先将v插入拓扑排序的队列中的第i个位置上
然后将v从图G中删除
Topusort(G, n+1);
将刚才删除的v及其所有的边恢复
}
}
}
}
对图一建立的邻接表:
2 ^
0 1
4 ^
2 2
4 ^
2
0 3
2 4 ^
表一
使所有的顶点的的visited[i]=0。对所有入度为0的顶点,进行循环:对第一个顶点进行排序,
2 ^
6
6^
0 1
4 ^
1 2
4 ^
2
0 3
2 4 ^
表二
顶点1 的入度为0,将顶点1放入show[]中,使visited[1]=1. 顶点2的入度减1。
show[]:1
递归调用拓扑函数,对下一个顶点排序。
2 ^
1
4 ^
0 2
4 ^
2
0 3
1 4 ^
表三
顶点3的入度为0,将顶点3
文档评论(0)