拓扑排序

代码:

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 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++;

for (int v : adj[u]) {
    if (--inDegree[v] == 0) {
        q.push(v);
    }
}

}

首先将所有入度为 0 的节点入队(这些是可以立即执行的任务)
每次从队列中取出一个节点,处理其后继节点:
将后继节点的入度减 1
如果某个后继节点的入度变为 0,将其入队
count变量记录拓扑排序过程中处理的节点总数

posted @ 2025-06-24 15:14  YOLO霖  阅读(10)  评论(0)    收藏  举报