拓扑排序及逆拓扑排序

这篇具有很好参考价值的文章主要介绍了拓扑排序及逆拓扑排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

拓扑排序其实就是对有向无环图的顶点的一种排序,每个顶点出现且只出现一次。

对一个AOV网进行拓扑排序的方法:

1、从AOV网中选择一个入度为0的顶点并输出;

2、从网中删除该顶点和所有以它为起点的有向边;

3、重复1和2直到当前的AOV网为空或当前网中不存在入度为0的顶点为止;

1、拓扑排序算法 

该算法中假设使用邻接表作为存储结构:

//拓扑排序
#define Maxsize 100
int indegree[Maxsize];         //存储当前顶点的入度
int print[Maxsize];           //记录拓扑序列
Stack<int> S;                //存储入度为0的顶点

bool TopologicalSort(Graph G)
{
	InitStack(S);           //初始化栈
	for(int i=0;i<G.vexnum;i++)
	{
		if(indegree[i]==0)     //度为0的顶点入栈 
		{
			push(S,i);
		}
	} 
	int count=0;       //计数
	while(!IsEmpty(S))
	{
		pop(S,i);
		print[count++]=i;
		for(p=G.vertices[i].firstarc;p;p=p->nextarc)//将所有i指向的顶点的入度减1,并且将入度减为0的顶点压入栈中 
		{
			v=p->adjvex;
			if(!(--indegree[v]))
			{
				push(S,v)
			}
		}
		if(count<G.vexnum)     //拓扑排序失败,说明有回路 
		{
			return false;
		}
		else
		{
			return true;
		}
			
	} 
 } 

时间复杂度为:O(|V|+|E|);若采用邻接矩阵存储时,其时间复杂度为O(|V|^2);

2、使用DFS进行拓扑排序 

祖先结点的DFS函数结束时间大于子孙结点的DFS函数结束时间,利用DFS求出各顶点结束时间,对于拓扑排序,就是将结束时间从大到小排序。

 //深度优先遍历实现的拓扑排序
 bool visit[Maxnum];      //标记数组,防止顶点被多次访问 
 void DFSTraverse(Graph G)
 {
 	for(int i=0;i<G.vexnum;i++)
 	{
 		visit[i]=false;
	}
	int time=0;       //记录每个顶点调用DFS函数结束时间 
	for(int i=0;i<G.vexnum;i++)
	{
		if(!visit[i])
		DFS(G,i);
	}
  } 
  void DFS(Graph G,int v)
  {
  	visit[v];
  	visit[v]=true;
  	for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,V,W))  //从顶点v出发,深度优先遍历G
	{
	 	if(!visit[w]);
	 	DFS(G,w);
	} 
	time+=1;
	finishTime[v]=time; 
  } 

3、逆拓扑排序 

逆拓扑排序的步骤:

1、从AOV网中选择一个出度为0的顶点并输出;

2、从网中删除该顶点和所有以它为终点的有向边;

3、重复1和2,直到当前的AOV网为空;

#define Maxsize 100
//拓扑排序
int Dedegree[Maxsize];         //存储当前顶点的出度
int print[Maxsize];           //记录拓扑序列
Stack<int> S;                //存储出度为0的顶点

bool TopologicalSort(Graph G)
{
	InitStack(S);           //初始化栈
	for(int i=0;i<G.vexnum;i++)
	{
		if(Dedegree[i]==0)     //度为0的顶点入栈 
		{
			push(S,i);
		}
	} 
	int count=0;       //计数
	while(!IsEmpty(S))
	{
		pop(S,i);
		print[count++]=i;
		for(p=G.vertices[i].firstarc;p;p=p->nextarc)//将指向i的顶点的出度减1,并且将出度减为0的顶点压入栈中 
		{
			v=p->adjvex;
			if(!(--Dedegree[v]))
			{
				push(S,v)
			}
		}
		if(count<G.vexnum)     //拓扑排序失败,说明有回路 
		{
			return false;
		}
		else
		{
			return true;
		}		
	} 
 } 

4、DFS遍历实现逆拓扑排序 

 //DFS实现的逆拓扑排序
 bool visit[Maxnum];      //标记数组,防止顶点被多次访问 
 void DFSTraverse(Graph G)
 {
 	for(int i=0;i<G.vexnum;i++)
 	{
 		visit[i]=false;
	}
	for(int i=0;i<G.vexnum;i++)
	{
		if(!visit[i])
		DFS(G,i);
	}
  } 
  void DFS(Graph G,int v)
  {
  	visit[v];
  	visit[v]=true;
  	for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,V,W))  //从顶点v出发,深度优先遍历G
	{
	 	if(!visit[w]);
	 	DFS(G,w);
	} 
	cout<<v;           //输出顶点 
  } 

总结:

1、拓扑排序和逆拓扑排序序列都可能不唯一;

2、若图中有环,则不存在拓扑排序序列或者逆拓扑排序序列; 文章来源地址https://www.toymoban.com/news/detail-427524.html

到了这里,关于拓扑排序及逆拓扑排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 拓扑排序及逆拓扑排序

    拓扑排序其实就是对有向无环图的顶点的一种排序,每个顶点出现且只出现一次。 对一个AOV网进行拓扑排序的方法: 1、从AOV网中选择一个入度为0的顶点并输出; 2、从网中删除该顶点和所有以它为起点的有向边; 3、重复1和2直到当前的AOV网为空或当前网中不存在入度为0的

    2024年02月01日
    浏览(42)
  • 有向图的拓扑排序

    拓扑排序 。任意给定一个有向图,设计一个算法,对它进行拓扑排序。拓扑排序算法思想:a.在有向图中任选一个没有前趋的顶点输出;b.从图中删除该顶点和所有以它为尾的弧;c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出序列即为一个拓朴有序序列;或者直到

    2024年02月09日
    浏览(48)
  • 2023-8-29 有向图的拓扑排序

    题目链接:有向图的拓扑排序

    2024年02月11日
    浏览(37)
  • 教学计划编制问题(数据结构 有向图 拓扑排序)

     本文对以下教学计划编制问题的解决作出实现,主要使用c语言(带一点cpp),开发环境为codeblocks 17.12,希望对各位读者有所帮助。(源码和数据文件可在主页获取,同时还有使用视频文件压缩包,数据文件需要和exe在同一目录下,结合某读者的意见同时放到github了 ) 地址如下

    2024年02月09日
    浏览(56)
  • 【数据结构】有向无环图(AOE-网)的关键路径(C语言)

    把用顶点表示事件,用弧表示活动,弧的权值表示活动所需要的时间的有向无环图称为 边表示活动的网 ,简称 AOE-网 。 在AOE-网中存在唯一的、入度为0的顶点,称为 源点 ;存在唯一的、出度为0的顶点,称为 汇点 。从源点到汇点的最长路径长度即为完成整个工程任务所需的

    2024年02月07日
    浏览(44)
  • 有向无环图的应用—描述表达式、AOV网、AOE网

    目录 一、有向无环图描述表达式 二、拓扑排序 相关概念  实现方法  算法代码  补充 三、关键路径 相关概念  算法步骤  补充  四、总结图的应用我们都学了什么 有向无环图 :若一个有向图中不存在环,则称为有向无环图,简称DAG图。  对于一个表达式 ( (a+b)* ( b*(c+d)

    2024年02月12日
    浏览(47)
  • (Java)数据结构——图(第八节)有向无环图(DAG图)以及DAG描述表达式

    本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。 昨天复习了拓扑排序,打算写个博客,一翻数据结构的书到那,发现连着概念还有DAG图以及AOV网,于是看了看,这篇博客先来介绍有向无环图DAG。 下图一个无环的有向图乘坐有向无环图,

    2024年04月12日
    浏览(39)
  • 【海量数据挖掘/数据分析】之 贝叶斯信念网络(贝叶斯信念网络、有向无环图、贝叶斯公式、贝叶斯信念网络计算实例)

    目录 【海量数据挖掘/数据分析】之 贝叶斯信念网络(贝叶斯信念网络、有向无环图、贝叶斯公式、贝叶斯信念网络计算实例) 一、贝叶斯信念网络 1 . 属性关联 : 贝叶斯信念网络 允许数据集样本属性 之间存在依赖关系 ; 2 . 贝叶斯信念网络 表示方法 : 二、概率图模型 : 马尔

    2024年02月12日
    浏览(54)
  • 搜索与图论-有向图的拓扑序列

    有向图的拓扑序列就是图的广度优先遍历的一个应用。 若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个 拓扑序列 。(起点在终点的前面) 拓扑序列是针对有向图,无向图是没有拓扑序列的。 有向无环图一定是

    2024年02月01日
    浏览(44)
  • 二十一、搜索与图论——拓扑序列(有向图)

    拓扑序列定义: 若一个由图中所有点构成的序列 A满足:对于图中的每条边 (x,y),x在 A中都出现在 y之前,则称 A是该图的一个拓扑序列。 人话: 始终满足每条边的起点在终点前面,从前指向后。 注意:如果在有向图中构成一个环,则必定无法构成拓扑结构,也可以证明有向

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包