如今你總共有 n 門課須要選,記爲 0 到 n-1。數組
在選修某些課程以前須要一些先修課程。 例如,想要學習課程 0 ,你須要先完成課程 1 ,咱們用一個匹配來表示他們: [0,1]學習
給定課程總量以及它們的先決條件,判斷是否可能完成全部課程的學習?ui
示例 1:.net
輸入: 2, [[1,0]] 輸出: true 解釋: 總共有 2 門課程。學習課程 1 以前,你須要完成課程 0。因此這是可能的。code
示例 2:blog
輸入: 2, [[1,0],[0,1]] 輸出: false 解釋: 總共有 2 門課程。學習課程 1 以前,你須要先完成課程 0;而且學習課程 0 以前,你還應先完成課程 1。這是不可能的。排序
說明:get
拓撲排序。it
拓撲排序通常用來解決完成A必須先完成B的題。io
拓撲排序的關鍵:
1.BFS或DFS來解決入度爲0的節點
2.構造圖
3.維護各個節點入度的數組
4.判斷是否有循環路徑,有則不能構成拓撲排序。(判斷以出節點是否等於總節點數)
class Solution { public: bool canFinish(int numCourses, vector<pair<int, int> >& prerequisites) { vector<vector<int> > G(numCourses); vector<int> inDegree(numCourses, 0); queue<int> q; for(int i = 0; i < prerequisites.size(); i++) { G[prerequisites[i].second].push_back(prerequisites[i].first); inDegree[prerequisites[i].first]++; } int cnt = 0; for(int i = 0; i < numCourses; i++) { if(inDegree[i] == 0) { q.push(i); } } while(!q.empty()) { int first = q.front(); q.pop(); cnt++; for(int i = 0; i < G[first].size(); i++) { if(--inDegree[G[first][i]] == 0) { // q.push(G[first][i]); } } } if(cnt < numCourses) return false; return true; } };