左神算法基础class6—题目3拓扑排序

本文介绍了拓扑排序的应用场景和原理,特别是在处理头文件依赖关系中的应用。拓扑排序要求有向图无环,并从入度为0的节点开始输出。文章详细分析了拓扑排序的过程,包括使用map存储节点入度,使用queue暂存并输出入度为0的节点,以及如何更新其他节点的入度。同时,提供了核心代码和完整的实现,最后展示了正确的输出结果。
摘要由CSDN通过智能技术生成

左神算法基础class6—题目3拓扑排序

1.题目:拓扑排序

拓扑排序算法适用范围:要求①有向图②有入度为0的节点③没有环

2.分析

在程序编译时,往往会有头文件互相依赖的情况,在图中箭头被指向的节点可以看做依赖于指向它的节点。如下图a依赖于b,c,d,而b又依赖c,k;d依赖k
在这里插入图片描述
那么拓扑排序的输出顺序是不依赖别的点的先输出。先输出k,c,删去k,c这时没有别的节点指向b,d了,输出b,d,最后,节点只剩下a再输出。
在图中可以用入度表示依赖情况,入度为零就是没有别的点指向它,可以先输出。输出后其指向的节点入度减一视为删去输出的点。
过程如下:
①为了方便查找,使用map存储节点与入度方便查找与修改入度(不能反过来),使用queue存储入度为零的节点用于暂存需要输出的点。
②遍历图中的所有节点,把所有入度为零的节点放入队列
③输出入度为零的节点
④把入度为零的节点所指向的节点的入度减一(相当于删去当前节点)若减一后入度为零加入队列
⑤在入度为0的队列不空的情况下重复③④

3.核心代码

list<Node*> sortedTopology(Graph graph)
{
   
	unordered_map<Node*,int> inMap;			//存储节点与入度 
	queue<Node*> zeroInQueue;				//存储入度为零的节点 
	unordered_map<int,Node*>::iterator ite = graph.nodes.begin();
	//遍历图中的所有节点,把所有入度为零的节点放入队列 
	while(ite != graph.nodes.end())								
	{
   
		inMap.insert(pair<Node*,int>(ite->second,ite->second->in));
		if(ite->second->in == 0)
			zeroInQueue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值