数据结构图 ------ 拓扑排序

一,拓扑排序的基本概念

拓扑排序听起来很抽象,但是其实并不难,拓扑排序主要分为2点。

  • 首先将入度为0的顶点找到,然后作为一个排序目标排下去,
  • 接着把自身顶点删掉,删掉的同时注意把相对应的弧或者边也删掉。
  • 然后再找入度为0的顶点,然后…………………………

比如下图:
在这里插入图片描述
上面的拓扑排序就是 0 1 4 5 2 3 6。
下图,当出现两个顶点 1 和 4 的入度都为 0时候 ,其实两种都可以选择,所以拓扑排序的序列并不是唯一的
在这里插入图片描述

二,拓扑排序的实现

有了对拓扑排序的理解,实现起来就很简单了。下面将会提到栈,但是都学到这里来了,栈要是不理解的话可以返回去看一下子。
第一步:建立一个栈,并把图中入度为0的点全部入栈。

 	int* stack = (int*)malloc(sizeof(int) * LG.vexnum);	
	
	//初始化栈	 将 图中入度为 0 的全部入栈 
	top = 0;
	for (i = 0; i < LG.vexnum; i++)
	{
		if(LG.adjlist[i].in == 0)
		{
			stack[++top] = i;
		} 
	}

第二步:出栈,然后将栈中所对应元素的入度删除
当你删除的过程中,如果删完之后发现它的入度已经为0了,那么直接将它入栈就好了。

	printf("拓扑排序结果如下:\n");
	//记录 
	count = 0;
	while( top != 0)
	{
		
		//出栈 
		gettop = stack[top--];
		printf("%d-> ",LG.adjlist[gettop].data);
		count++;
		
		//删除于刚出栈有关顶点的所有边 即入度
		ArcNode* cur = LG.adjlist[gettop].fristarc;
		while(cur != NULL)
		{
			LG.adjlist[cur->adjvex].in--;

			
			//如果在减完之后入度为 0 了 那么 直接入栈即可 
			if (LG.adjlist[cur->adjvex].in == 0)
			{
				stack[++top] = cur -> adjvex;
			}
			
			cur = cur -> next;
		}
		
	}
	printf("\n");

三,结尾

拓扑排序主要理解了它是如何进行排序的,实现不是问题。
要注意的是,如果此网的全部顶点都被输出,则证明此网不存在环,否则此网存在回路。
拓扑排序源码链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值