拓扑排序学习笔记

发布时间 2023-10-10 22:53:32作者: Moyyer_suiy

拓扑排序 - oiwiki


在有向无环图中,若一个由该图中所有点构成的序列满足:图中所有边 (x,y),x 在序列 A 中都出现在 y 前,则称 A 是该图的一个拓扑序。求解序列 A 的过程就叫拓扑排序。

拓扑排序可以解决一个有向无环图的所有节点排序。我理解的话,就是按每个店的入度多少的顺序找到一种有序的遍历有向无环图的方式。

求拓扑排序:把入度为 0 的点加到队列中,然后遍历他能到达的点。将到达的点入度 -1,如果出现入度为 0 的点就将它再加入队列。

至于想要维护存在情况互不影响的点出现的先后顺序,可以用堆实现。


1.拓扑排序模板

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

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n;
int rd[N];
int ans[N],tot;
queue<int> q;
vector<int> e[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x;
		while(scanf("%d",&x)){
			if(x){
				e[i].push_back(x);
				rd[x]++;
			}
			else break;
		}
	}
	for(int i=1;i<=n;i++) if(!rd[i]) q.push(i);
	while(q.size()){
		int x=q.front();
		q.pop();
		ans[++tot]=x;
		for(auto i:e[x]){
			rd[i]--;
			if(rd[i]==0) q.push(i);
		}
	}
	for(int i=1;i<=n;i++) printf("%d ",ans[i]);
	return 0;
}