1 // 將先修關系構成一張圖,由每個數對的第二個數字向第一個數字連邊。 2 // 首先將所有入度為0的點進隊,准備拓撲排序。 3 // 寬搜過程中,將當前結點所關聯的結點的入度減1;若發現新的入度為0的結點,則將其進隊。 4 // 最后如果遍歷了所有結點,則說明可以滿足要求;否則,先修關系存在環。 5 6 //查找是否有環 7 class Solution 8 { 9 public: 10 bool canFinish(int numCourses, vector<vector<int>>& prerequisites) 11 { 12 vector<vector<int>> graph(numCourses); 13 vector<int> in_degree(numCourses, 0); 14 for (int i = 0; i < prerequisites.size(); i++) 15 { 16 in_degree[prerequisites[i][0]]++; 17 graph[prerequisites[i][1]].push_back(prerequisites[i][0]); 18 } 19 20 queue<int> q; 21 vector<bool> vis(numCourses, false); 22 23 for (int i = 0; i < numCourses; i++) 24 if (in_degree[i] == 0) 25 q.push(i); 26 while (!q.empty()) 27 { 28 int sta = q.front(); 29 q.pop(); 30 vis[sta] = true; 31 //有哪些鄰邊 32 for (int i = 0; i < graph[sta].size(); i++) 33 { 34 in_degree[graph[sta][i]]--;// 入度-1 35 if (in_degree[graph[sta][i]] == 0) //入度如果為0,加入隊列 36 q.push(graph[sta][i]); 37 } 38 } 39 40 //0->1->2 41 for (int i = 0; i < numCourses; i++) 42 if (vis[i] == false) 43 return false;//有環 44 return true;//無環 45 } 46 };