从LeetCode 210. Course Schedule II 了解拓扑排序
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                从LeetCode 210. Course Schedule II 了解拓扑排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                問題簡述
給定n節課,每節課按0~n-1編號。
 在修某些課的時候需要有其它課的基礎,必須先上先修課。現在用pair的形式來表示要先修的課,比如 [ [0,1], [1,2] ] 就表示在修課程1之前必須先修課程0,修課程2之前必須修課程1。現在需要給出一個修課的順序,使得按照該順序修課可以順利得到所有學分。
 現在的輸入為課程數和先修的順序,輸出為修課順序中的一種。
 比如:
又比如:
例子2 輸入: 4, [[1,0],[2,0],[3,1],[3,2]] 輸出: [0,1,2,3] 或者 [0,2,1,3](其中一個即可)再比如:
例子3 輸入: 2, [[1,0], [0,1]] 輸出: [] 因為無法滿足修課程1之前修課程0,同時修課程0之前修課程1,所以返回空解決思路
其實這個問題就是讓我們在給定的輸入下,判斷能否完成拓撲排序。何為拓撲排序(詳見這里)?
 比如,在輸入為
的情況下,得到的下圖1就是一個拓撲排序,也就是一個沒有環的有向圖。
 
源代碼
下面是一個基于BFS的拓撲排序思路,其實也不能說是嚴格意義上的BFS,只是有點像~
struct Node{int indegree;vector<int> adjacency;Node(){indegree = 0;adjacency.clear();} };class Solution { private:vector<int> res;public:vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {vector<Node*> vec;for (int i = 0; i < numCourses; i++){vec.push_back(new Node());}for (int i = 0; i < prerequisites.size(); i++){vec[prerequisites[i].first]->indegree++;vec[prerequisites[i].second]->adjacency.push_back(prerequisites[i].first);}for (int i = 0; i < vec.size(); i++){int j = 0;for (; j < vec.size(); j++){if (vec[j]->indegree == 0){res.push_back(j);vec[j]->indegree = -1;for (int item : vec[j]->adjacency){vec[item]->indegree--;}break;}}if (j == vec.size()){res.clear();return res;}}return res;} };總結
以上是生活随笔為你收集整理的从LeetCode 210. Course Schedule II 了解拓扑排序的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: LeetCode 5832. 构造元素不
- 下一篇: python函数在传参的时候,到底在传些
