AcWing 848. 有向图的拓扑序列(STL队列版)
原题链接
简单
作者:
Shimmers微光
,
2021-07-20 10:16:53
,
所有人可见
,
阅读 243
C++ 代码
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1e5 + 10;
int n, m, k = 0; //k为res[]的下标
int h[N], e[N], ne[N], idx;
int d[N]; //存储每个节点的入度
queue<int> q;
int res[N]; //存储拓扑序列
//添加一条边ab
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
bool topsort() {
for(int i = 1; i <= n; i++) //所有入度为0的节点入队
if(!d[i]) q.push(i);
while(!q.empty()) {
int t = q.front();
res[k++] = t;
q.pop();
for(int i = h[t]; i != -1; i = ne[i]) {
int j = e[i];
d[j]--; //被访问时入度减一
if(!d[j]) q.push(j); //入度为0时入队
}
}
return k == n; //当res[]中元素数目等于n时, 说明所有节点已进队, 存在拓扑序列
}
int main() {
cin >> n >> m;
memset(h, -1, sizeof h);
for(int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
add(a, b);
d[b]++ ; //节点b入度加一
}
if(topsort()) {
for(int i = 0; i < n; i++) cout << res[i] << " ";
puts("");
} else puts("-1");
return 0;
}