leetcode【210】【Depth-first Search】Course Schedule II【c++版本】

凡凡.cs發表於2020-12-14

問題描述:

There are a total of n courses you have to take labelled from 0 to n - 1.

Some courses may have prerequisites, for example, if prerequisites[i] = [ai, bi] this means you must take the course bi before the course ai.

Given the total number of courses numCourses and a list of the prerequisite pairs, return the ordering of courses you should take to finish all courses.

If there are many valid answers, return any of them. If it is impossible to finish all courses, return an empty array.

 

Example 1:

Input: numCourses = 2, prerequisites = [[1,0]]
Output: [0,1]
Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1].

Example 2:

Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
Output: [0,2,1,3]
Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0.
So one correct course order is [0,1,2,3]. Another correct ordering is [0,2,1,3].

Example 3:

Input: numCourses = 1, prerequisites = []
Output: [0]

原始碼:

和上一題比較像leetcode【207】【Depth-first Search】Course Schedule【c++版本】,不過這一題需要找到序列,當然也可以用上一題類似的做法,但是在這裡我們考慮用一個佇列解決。

  • 我們先為所有節點建立一個圖graph,並且計算他們的入度indegree;
  • 將入度為0的點放入佇列points;
  • 拿出隊首元素新增到result,將其相鄰的節點入度減一,再次將入度為0的節點放入佇列,重複多次直至佇列為空;
  • result的長度是否等於節點個數numCourses,若不等於則說明沒有遍歷完,即存在環,返回空result;否則返回result。
class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> result;
        vector<vector<int>> graph (numCourses, vector<int> (numCourses, 0));
        vector<int> indegree(numCourses, 0);
        queue<int> points;
        for (int i=0; i<prerequisites.size(); i++) {
            graph[prerequisites[i][1]][prerequisites[i][0]] = 1;
            indegree[prerequisites[i][0]]++;
        }
        for (int i=0; i<numCourses; i++) {
            if (indegree[i] == 0) {
                points.push(i);
            }
        }
        
        while (!points.empty()) {
            int tmp = points.front();
            points.pop();
            result.push_back(tmp);
            for (int i=0; i<numCourses; i++) {
                if(graph[tmp][i] && --indegree[i] == 0) {
                    points.push(i);
                }
            }
        }
        if (result.size() != numCourses) {
            return vector<int> ();
        }
        return result;
    }
};

 

相關文章