拓撲排序——判斷有向圖中是否存在環


 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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM