概念 :
- 拓扑排序只有有向图有 , 可以判断图中是否有环 ;
Kahn(卡恩)算法
过程 :
模板 :
vector<int> a[N] , res ;
int d[N] ; // 存放每个结点的入度
int n , x ;
bool toposort() {
queue<int> q;
for(int i = 1; i <= n; i++)
if(d[i] == 0)
q.push(i); // 将入度为 0 的点全放进来
while(!q.empty()) {
int u = q.front() ; q.pop();
res.push_back(u);
for(auto v : a[u])
if(--d[v] == 0)
q.push(v);
}
return res.size()==n ;
}
例题 :
【模板】拓扑排序 / 家谱树 - 洛谷
代码 :
#include<bits/stdc++.h>
using namespace std;
const int N = 102 ;
vector<int> a[N] , res ;
int d[N] ; // 存放每个结点的入度
int n , x ;
bool toposort() {
queue<int> q;
for(int i = 1; i <= n; i++)
if(d[i] == 0)
q.push(i); // 将入度为 0 的点全放进来
while(!q.empty()) {
int u = q.front() ; q.pop();
res.push_back(u);
for(auto v : a[u])
if(--d[v] == 0)
q.push(v);
}
return res.size()==n ;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
while(cin >> x){
if(x == 0) break;
a[i].push_back(x) ; // 能够到达哪些点
d[x] ++ ; // 入度 ++ ;
}
}
if(toposort()) {
for(int x : res) cout << x << " " ;
}
return 0 ;
}
视频讲解链接(董老师) :
D01 拓扑排序_哔哩哔哩_bilibili