Living-Dream 系列笔记 第35期

Posted on 2024-03-02 16:59  _XOFqwq  阅读(2)  评论(0编辑  收藏  举报

拓扑排序(\(\texttt{toplogical sort}\)):

在有向无环图(\(\texttt{DAG}\))中,将 \(n\) 个节点整理成一组排列,使得对于每一条边 \(u \to v\)\(u\) 在排列中的位置总是在 \(v\) 之前,我们称这样的排列为原图的拓扑序,找出一张图的拓扑序的过程则被称为拓扑排序

拓扑排序不一定唯一。

实现:

  • 统计所有节点的入度 \(in_u\),并将 \(in_u=0\) 的节点丢入队列;

  • 循环输出队首弹出,并将其指向的所有节点的入度 \(-1\),若入度为 \(0\) 了则继续丢入队列;

  • 最后,若队列弹出的节点数不足 \(n\) 个,则原图无拓扑序(因为有环)。

时间复杂度是 \(O(n+m)\) 的。

void topo_sort(){
	queue<int> q;
	for(int i=1;i<=n;i++)
		if(!in[i]) q.push(i);
	while(!q.empty()){
		int cur=q.front();
		cout<<cur<<'\n',q.pop();
		for(auto i:G[cur]){
			in[i]--;
			if(!in[i]) q.push(i);
		}
	}
}

没有例题(悲)。