用bfs 前驅表後繼表實現207. 課程表
阿新 • • 發佈:2022-03-22
//[[1,0]]表示學1之前要先學0 class Solution { public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { vector<int> vec(numCourses);//記錄所有頂點的入度,未初始化的為0 // degrees(numCourses)宣告並初始化為numC 個0 vector<vector<int>> ans(numCourses); //鄰接表 queue<int> q;//零入度的頂點 int num = numCourses; for (int i = 0; i < prerequisites.size(); i++) { vec[prerequisites[i][0]]++;//入頂點vec[i] 表示課程i有vec[i]門前驅 ans[prerequisites[i][1]].push_back(prerequisites[i][0]);//出頂點 ans[i]表示課程i 有若干後繼分別是ans[i][0]到ans[i][n] }//ans[0]push進一個1;表示 課程0有1個初度指向課程1for (int i = 0; i < numCourses; i++) if (vec[i] == 0) {//課程i沒有前驅 q.push(i); //入度為0的先入佇列 num--; } while (!q.empty()) { int temp = q.front(); q.pop();//學習目前沒有前驅的課程 for (int j = 0; j < ans[temp].size(); j++)//ans[temp].size()表示課程temp有ans[temp].size()個後繼 if (--vec[ans[temp][j]] == 0) {//即課程ans[temp][j] 的前驅是否為0 q.push(ans[temp][j]); num--; } } if (num == 0) return true; return false; } };