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

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);
    }
};

 

上一篇:207. 课程表


下一篇:课程表