AcWing 848. 有向图的拓扑序列
原题链接
简单
作者:
没有雪的冬天
,
2025-01-15 18:52:06
,
所有人可见
,
阅读 1
C++ 代码
#include <iostream>
#include <vector>
#include <queue> // 包含 queue 头文件
using namespace std;
queue<int> T;
bool TopLogical(vector<vector<int>>& adjList, int n) {
int cnt = 0;
vector<int> inDegree(n + 1, 0); // 入度数组
// 统计每个节点的入度
for (int i = 1; i <= n; i++) {
for (int neighbor : adjList[i]) {
inDegree[neighbor]++;
}
}
queue<int> q; // 定义队列
// 将所有入度为 0 的节点入队
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) {
q.push(i);
}
}
// 进行拓扑排序
while (!q.empty()) {
int top = q.front();
T.push(top);
q.pop();
cnt++;
// 将当前节点的邻居入度减 1
for (int neighbor : adjList[top]) {
inDegree[neighbor]--;
if (inDegree[neighbor] == 0) {
q.push(neighbor);
}
}
}
// 如果 cnt == n,说明无环;否则有环
return cnt == n;
}
int main() {
int n, m; // n 是节点数量,m 是边的数量
cin >> n >> m;
// 初始化邻接表
vector<vector<int> > adjList(n + 1); // 节点编号从 1 到 n
// 输入 m 条边
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
adjList[a].push_back(b); // 添加一条从 a 到 b 的边
}
// 拓扑排序判断是否有环
if (TopLogical(adjList, n)) {
while(!T.empty()){
cout<<T.front()<<" ";
T.pop();
}
} else {
puts("-1"); // 有环
}
return 0;
}