力扣刷題筆記:207. 課程表

和BUG做朋友的zhj發表於2020-10-25

題目207. 課程表

寫題思路

  • 這是一題典型的拓撲排序
  • 首先,我們根據題目意思,將課程關係做成鄰接矩陣,並儲存每個課程的入度
  • 再建立佇列,儲存入讀為零的課程名,
  • 進入迴圈(退出條件是佇列裡沒有元素)
  • count 計數,u 儲存隊頭元素,並將隊頭元素pop,再接著把將u作為先修課的課程indeg–,
  • 最後判斷count 與numCourses 的比較

原始碼

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> edges;
        vector<int> indeg;
        edges.resize(numCourses);
		indeg.resize(numCourses);

        for(const auto& a : prerequisites){
            edges[a[1]].push_back(a[0]);
            ++indeg[a[0]];
        }

        queue<int> q;
        for(int i = 0; i < numCourses; ++i){
            if(indeg[i] == 0){
                q.push(i);
            }
        }

        int vidited = 0;
        while(!q.empty()){
            ++vidited;
            int u = q.front();
            q.pop();
            for(int i : edges[u]){
                --indeg[i];
                if(indeg[i] == 0){
                    q.push(i);
                }
            }
        }
        return vidited == numCourses;
    }
};

相關文章