1. 程式人生 > >判斷有向圖是否有環之拓撲排序-LeetCode 207. Course Schedule

判斷有向圖是否有環之拓撲排序-LeetCode 207. Course Schedule

  1. 拓撲排序:對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。
    下圖是一個拓撲排序:

    下圖不是一個拓撲排序:


  2. 如何獲得一個圖的拓撲排序:找到圖中所有入度為0的點,放入序列,刪除這些點和以這些點為出度的邊,再找所有入度為0的點,依次迴圈。
  3. 如何通過拓撲排序判斷圖中是否有環:拓撲排序之後,若還剩有點,則表示有環。

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