欲望以提升热忱,毅力以磨平高山!|

XichenOC

园龄:1个月粉丝:4关注:0

2025-01-20 19:10阅读: 11评论: 0推荐: 0

拓扑排序(学习笔记)

\(topusort——Kahn\)

B3644 【模板】拓扑排序 / 家谱树

定义:

拓扑排序是指在一有向无环图中,找到一点的顺序,使得每一个排在前面的树不能依赖后面的节点,及后面的节点无法到达前面的节点

作用:

拓扑排序可以判断图中是否有环,还可以用来判断图是否是一条链。拓扑排序可以用来求 AOE 网中的关键路径,估算工程完成的最短时间。

\(Kahn\)算法实现:

我们只需要统计所有点的入度,若一个点的入度为零,则将这个点加入拓扑序中,并将所有这个点所连的点的入度减一即可,一直循环下去,直到无入度为零的点。我们可以用队列来维护入度为零的点。最后只需要判断拓扑答案中点的个数是否等于总点数即可判断是否有拓扑序(整体代码实现与\(dijkstra\)相似)

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1000;
vector<int>e[N];
int in[N];
int n;
void topusort(){
	vector<int>ans;
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(in[i]==0)q.push(i);
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		ans.push_back(u);
		for(auto it:e[u]){
			in[it]--;
			if(in[it]==0)q.push(it); 
		} 
	}
	if(ans.size()==n){
		for(auto it:ans)cout<<it<<" ";
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int u;
		while(1){
			cin>>u;
			if(!u)break;
			e[i].push_back(u);
			in[u]++;
		}
	}
	topusort();
}

练习:

\(1.P1137\) 旅行计划 题解
\(2.P1347\) 排序 题解

本文作者:XichenOC

本文链接:https://www.cnblogs.com/XichenOC/p/18682356

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   XichenOC  阅读(11)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起