拓扑排序
代码:
include
include
include
using namespace std;
int main() {
int n;
cin >> n;
// 存储每个节点的入度
vector<int> inDegree(n + 1, 0);
// 邻接表存储图结构
vector<vector<int>> adj(n + 1);
// 读取每个任务的依赖关系
for (int i = 1; i <= n; i++) {
int k;
cin >> k;
inDegree[i] = k;
for (int j = 0; j < k; j++) {
int dep;
cin >> dep;
adj[dep].push_back(i);
}
}
// 初始化队列,将入度为0的节点入队
queue<int> q;
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) {
q.push(i);
}
}
// 拓扑排序计数
int count = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
count++;
// 遍历u的所有后继节点,减少它们的入度
for (int v : adj[u]) {
if (--inDegree[v] == 0) {
q.push(v);
}
}
}
// 如果所有节点都被访问到,则无环,任务调度可行
cout << (count == n ? 1 : 0) << endl;
return 0;
}
拓扑排序核心逻辑
cpp
运行
queue
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) {
q.push(i);
}
}
int count = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
count++;
for (int v : adj[u]) {
if (--inDegree[v] == 0) {
q.push(v);
}
}
}
首先将所有入度为 0 的节点入队(这些是可以立即执行的任务)
每次从队列中取出一个节点,处理其后继节点:
将后继节点的入度减 1
如果某个后继节点的入度变为 0,将其入队
count变量记录拓扑排序过程中处理的节点总数

浙公网安备 33010602011771号