判斷有向圖是否有環之拓撲排序-LeetCode 207. Course Schedule
阿新 • • 發佈:2019-01-06
- 拓撲排序:對一個有向無環圖(Directed
Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。
下圖是一個拓撲排序:
下圖不是一個拓撲排序: - 如何獲得一個圖的拓撲排序:找到圖中所有入度為0的點,放入序列,刪除這些點和以這些點為出度的邊,再找所有入度為0的點,依次迴圈。
- 如何通過拓撲排序判斷圖中是否有環:拓撲排序之後,若還剩有點,則表示有環。
- leetcode程式碼:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<set<int>> matrix(numCourses); for(int i=0; i<prerequisites.size(); i++) matrix[prerequisites[i].second].insert(prerequisites[i].first); vector<int> degree(numCourses, 0); for(int i=0; i<numCourses; i++) for(auto it:matrix[i]) ++degree[it]; for(int i=0; i<numCourses; i++) { int j; for(j=0; j<numCourses && degree[j]!=0; ++j); if(j==numCourses) return false; degree[j] = -1; for(auto it:matrix[j]) --degree[it]; } return true; }