是的,你可以通过定义一个数组来记录每个节点的入度,并将入度为 0 的节点压入栈中,然后使用 DFS 算法获取拓扑序列。

首先,你需要定义一个数组来存储每个节点的入度信息,假设节点的数量为 n,那么可以定义一个大小为 n 的数组 inDegree,初始值都为 0。

接下来,你需要遍历所有的边,对于边 (u, v),将节点 v 的入度加 1,表示有一个节点指向 v。

然后,你可以定义一个栈来存储入度为 0 的节点。遍历所有的节点,将入度为 0 的节点压入栈中。

接下来,你可以使用 DFS 算法来获取拓扑序列。首先从栈中弹出一个节点,打印输出,然后遍历该节点指向的所有节点,将每个节点的入度减 1。如果减 1 后的入度为 0,将该节点压入栈中。重复以上步骤,直到栈为空。

下面是一个示例代码:

#include <iostream>
#include <vector>
#include <stack>
using namespace std;

void dfs(vector<vector<int>>& graph, vector<int>& inDegree, stack<int>& s) {
    while (!s.empty()) {
        int node = s.top();
        s.pop();
        cout << node << ' '; // 打印输出节点

        for (int i = 0; i < graph[node].size(); i++) {
            int nextNode = graph[node][i];
            inDegree[nextNode]--; // 入度减 1

            if (inDegree[nextNode] == 0) {
                s.push(nextNode); // 入度为 0 的节点压入栈中
            }
        }
    }
}

void topologicalSort(vector<vector<int>>& graph) {
    int n = graph.size();
    vector<int> inDegree(n, 0);
    stack<int> s;

    // 计算入度
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < graph[i].size(); j++) {
            int node = graph[i][j];
            inDegree[node]++;
        }
    }

    // 将入度为 0 的节点压入栈中
    for (int i = 0; i < n; i++) {
        if (inDegree[i] == 0) {
            s.push(i);
        }
    }

    // 深度优先搜索获取拓扑序列
    dfs(graph, inDegree, s);
}

int main() {
    vector<vector<int>> graph = {{1, 2}, {2, 3}, {4}, {4, 5}, {}};
    topologicalSort(graph);

    return 0;
}

以上代码通过定义一个数组 inDegree 来记录每个节点的入度,使用栈来存储入度为 0 的节点,最终通过 DFS 算法获取拓扑序列并打印输出。

C++ 实现拓扑排序:使用入度数组和 DFS 算法

原文地址: https://www.cveoy.top/t/topic/pcwp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录