三十、拓扑排序

其实所谓的拓扑排序,就是对有向图的指向顺序的一种排序。

好比我们打游戏,10级的时候我们只能做10级的任务,到了20级可能会再开启两个任务,以此类推。

其实就是对做执行任务顺序的一种约束。

下面的代码是伪代码,个人觉得没有必要去实现,我们只需要掌握思想,思想大于一切。

代码中的注释很清晰,给出了简单和进阶的两种实现方式,如有不懂请自行参考数据结构与算法分析C语言版


//伪代码,拓扑排序的简单实现
void TopSort(Graph G)
{
	//计数器
	int Counter; 
	//V:入度顶点,W:出度顶点
	Vertex V, W;
	//NumVertex:顶点数 , Counter其实时在遍历入度数
	for(Counter = 0; Counter < NumVertex; Conter++)
	{
		//找到入度为0的顶点
		V = FindNewVertexOfIndegreeZero(); 
		//如果不存在入度为0的顶点,说明这是一个有圈图,将不进行排序
		if(V == NotAVertex)
		{
			Error("Graph has a cycle");
			break;
		}
		//对该顶点进行排序,并删除
		TopNum[V] = Counter;
		//对与之关联的结点的入度-1
		for each W adjacent V
		{
			Indegree[W]--;;
		}
	}
}


//伪代码,拓扑排序的队列实现
void TopSort(Graph g)
{
	//声明队列
	Queue Q; 
	//计数器
	int Counter = 0;
	//V:入度顶点,W:出度顶点
	Vertex V, W;
	//创建队列
	Q = CreateQueue(NumVertex); 
	MakeEmpty(Q);
	//遍历所有结点
	for each vertex V
	{
		//如果结点入度为0,入队
		if(Indegree[V] == 0)
		{
			Enqueue(V, Q);
		}
	}

	//如果队列不是空
	while(!IsEmpty(Q))
	{
		//出队
		V = Dequeue(Q);
		//对该节点进行排序,并删除
		TopNum[V] = ++Counter;
		遍历与之关联的结点
		for each W adjacent to V
		{
			//入度自减后如果等于0
			if(--Indegree[W] == 0)
			{
				//入队
				Enqueue(W, Q);
			}
		}
		//释放队列
		DisposeQueue(Q);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值