W
e
l
c
o
m
e
: )

拓扑排序_学习记录

拓扑排序_学习记录

第一次在读入数据时被TLE……

What is 拓扑排序?

拓扑排序——Topological sorting(所以说写函数名时用ts 而不是 tp),拓扑排序要解决的问题是给一个有向无环图的所有节点排序。

顾名思义,就是可以把一个有向的无环的图中所有的点按照一定规则排序的算法……

emmm,还是不理解的话,看一眼下面的图吧
image
出自https://blog.csdn.net/z13192905903/article/details/103496819
这张图是按每个点的入度来排序的

也就是说,当我们读入一个图时,要先统计一下每个点的入度,然后每次取入度为0的点扔到队列中去,然后把从这个点出发的所有边删去——也就是把到达的所有节点的入度全部减1。一直循环,直到没有入度大于0的点为止。

当然,也可以用出度来排序,依据实际情况而定。

现阶段实现拓扑排序的方式为BFS。如果要输出所有拓扑排序的情况,那就用DFS。

下面是BFS实现代码:板子:家谱树。

#include<bits/stdc++.h>
using namespace std;
#define s(n) scanf("%d", &n)
int n, node[101], x; //node数组记录入度 
queue<int> q;
vector<int> G[101]; //这里用邻接表存边(感觉比向前星方便) 
inline void tsfind(){
	for(int i=1; i<=n; i++){
		if(node[i] == 0){ //找到入度为0的点 
			q.push(i); //扔进队列 
			--node[i]; //可要可不要 
		}
	}
	while(!q.empty()){
		int k = q.front(); q.pop();
		printf("%d ", k);
		for(int i=0; i<G[k].size(); i++){
			if(--node[G[k][i]] == 0){ //找到入度为0的点 
				q.push(G[k][i]); //扔进队列 
				--node[G[k][i]]; //可要可不要 
			}
		}
	}
}
int main(){
	s(n);
	for(int i=1; i<=n; i++){ //读入 
		while(s(x) && x){
			node[x]++;
			G[i].push_back(x);
		}
	}
	tsfind();
	return 0;
}
posted @ 2024-01-17 18:33  XiaoLe_MC  阅读(6)  评论(0编辑  收藏  举报