专栏文章

拓扑排序总结

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minoiaxq
此快照首次捕获于
2025/12/02 05:46
3 个月前
此快照最后确认于
2025/12/02 05:46
3 个月前
查看原文

拓扑排序总结

拓扑序:

定义:

给定n个点m条边的有向边,将n个点整理成一个序列,使得对于任意一条边i,总有i的出点在i的入店之前,这样的序列称之为图的拓扑序。

性质

1.只有有向无环图(DAG),才有拓扑序。
2.同一张图的拓扑序不一定唯一

拓扑排序:

整理拓扑序的算法称为拓扑排序。

拓扑排序的实现

1.统计每个点的入度in[i]
2.枚举所有点,并将入度为0的店插入队列(或者栈)
3.循环取出队头元素x输出,x指向的所有点y的入读-1,in[y]--;
4.当in[y]=0时,将y插入队列。 5.重复步骤3-4,直到队列为空。

code

CPP
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const int N=2e6+10;
int n,in[N];
vector<int> g[N];
queue<int> q;
void topo(){
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int x=q.front();
		cout<<x<<' ';
		q.pop();
		for(int i=0;i<g[x].size();i++){
			int y=g[x][i];
			in[y]--;
			if(in[y]==0) q.push(y);
		}
	}
	return ;
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;){
    	int x; cin>>x;
    	if(x){
    		g[i].push_back(x);
			in[x]++;
		}
    	else i++;
	}
	topo();
    return 0;
}

常见题型

1.普通拓扑排序(板子)
例:B3644
2.找环
例:P2712
3.DP+拓扑
例:P1113

时间复杂度

O(N+M)O(N+M)

评论

0 条评论,欢迎与作者交流。

正在加载评论...