Leetcode 210. 课程表 II (建图拓扑排序)

2021/10/23 6:11:43

本文主要是介绍Leetcode 210. 课程表 II (建图拓扑排序),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

每一个课程看作一个点,先修课程连出一条边指向后续课程,整体形成一个图。我们需要对这个图进行拓扑排序,如果图中存在环,则不存在拓扑序。拓扑排序最直接的方法是BFS。时间复杂度是O(n + m)

class Solution {
private:
    // 存储有向图
    vector<vector<int>> edges;
    // 存储每个节点的入度
    vector<int> indeg;
    // 存储答案
    vector<int> res;
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        edges.resize(numCourses);
        indeg.resize(numCourses);
        for (auto &prerequisite : prerequisites) {
            edges[prerequisite[1]].push_back(prerequisite[0]);
            indeg[prerequisite[0]]++;
        }
        queue<int> q;
        for (int i = 0; i < numCourses; i++) {
            if (indeg[i] == 0) {
                q.push(i);
            }
        }
        while (!q.empty()) {
            auto vertex = q.front(); q.pop();
            if (indeg[vertex] == 0) {
                res.push_back(vertex);
            }
            for (auto v : edges[vertex]) {
                indeg[v]--;
                if (indeg[v] == 0) {
                    q.push(v);
                }
            }
        }
        vector<int> null;
        return (res.size() != numCourses ?  null : res);
    }
};

 



这篇关于Leetcode 210. 课程表 II (建图拓扑排序)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程