拓扑排序学习笔记
在有向无环图中,若一个由该图中所有点构成的序列满足:图中所有边 (x,y),x 在序列 A 中都出现在 y 前,则称 A 是该图的一个拓扑序。求解序列 A 的过程就叫拓扑排序。
拓扑排序可以解决一个有向无环图的所有节点排序。我理解的话,就是按每个店的入度多少的顺序找到一种有序的遍历有向无环图的方式。
求拓扑排序:把入度为 0 的点加到队列中,然后遍历他能到达的点。将到达的点入度 -1,如果出现入度为 0 的点就将它再加入队列。
至于想要维护存在情况互不影响的点出现的先后顺序,可以用堆实现。
1.拓扑排序模板
#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;
}
本文作者:Moyyer_suiy
本文链接:https://www.cnblogs.com/Moyyer-suiy/p/17755751.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
学习笔记 / 图论
, 2023每日小记 / 10月的每天
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-10-10 CSP-S 2022游寄