拓扑排序(学习笔记)
\(topusort——Kahn\)
定义:
拓扑排序是指在一有向无环图中,找到一点的顺序,使得每一个排在前面的树不能依赖后面的节点,及后面的节点无法到达前面的节点
作用:
拓扑排序可以判断图中是否有环,还可以用来判断图是否是一条链。拓扑排序可以用来求 AOE 网中的关键路径,估算工程完成的最短时间。
\(Kahn\)算法实现:
我们只需要统计所有点的入度,若一个点的入度为零,则将这个点加入拓扑序中,并将所有这个点所连的点的入度减一即可,一直循环下去,直到无入度为零的点。我们可以用队列来维护入度为零的点。最后只需要判断拓扑答案中点的个数是否等于总点数即可判断是否有拓扑序(整体代码实现与\(dijkstra\)相似)
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
vector<int>e[N];
int in[N];
int n;
void topusort(){
vector<int>ans;
queue<int>q;
for(int i=1;i<=n;i++){
if(in[i]==0)q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
ans.push_back(u);
for(auto it:e[u]){
in[it]--;
if(in[it]==0)q.push(it);
}
}
if(ans.size()==n){
for(auto it:ans)cout<<it<<" ";
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int u;
while(1){
cin>>u;
if(!u)break;
e[i].push_back(u);
in[u]++;
}
}
topusort();
}
练习:
本文作者:XichenOC
本文链接:https://www.cnblogs.com/XichenOC/p/18682356
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步