日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

从LeetCode 210. Course Schedule II 了解拓扑排序

發(fā)布時(shí)間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从LeetCode 210. Course Schedule II 了解拓扑排序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題簡(jiǎn)述

給定n節(jié)課,每節(jié)課按0~n-1編號(hào)。
在修某些課的時(shí)候需要有其它課的基礎(chǔ),必須先上先修課。現(xiàn)在用pair的形式來表示要先修的課,比如 [ [0,1], [1,2] ] 就表示在修課程1之前必須先修課程0,修課程2之前必須修課程1。現(xiàn)在需要給出一個(gè)修課的順序,使得按照該順序修課可以順利得到所有學(xué)分。
現(xiàn)在的輸入為課程數(shù)和先修的順序,輸出為修課順序中的一種。
比如:

例子1 輸入: 2, [[1,0]] 表示共有兩門課,在修課程1之前必須修課程0 輸出: [0, 1] 表示修課順序?yàn)?->1

又比如:

例子2 輸入: 4, [[1,0],[2,0],[3,1],[3,2]] 輸出: [0,1,2,3] 或者 [0,2,1,3](其中一個(gè)即可)

再比如:

例子3 輸入: 2, [[1,0], [0,1]] 輸出: [] 因?yàn)闊o法滿足修課程1之前修課程0,同時(shí)修課程0之前修課程1,所以返回空

解決思路

其實(shí)這個(gè)問題就是讓我們?cè)诮o定的輸入下,判斷能否完成拓?fù)渑判颉:螢橥負(fù)渑判?#xff08;詳見這里)?
比如,在輸入為

4, [[1,0],[2,0],[3,1],[3,2]]

的情況下,得到的下圖1就是一個(gè)拓?fù)渑判?#xff0c;也就是一個(gè)沒有環(huán)的有向圖。

圖1 拓?fù)渑判蚴疽鈭D 比如改變一下輸入 ``` 4, [[1,0],[2,0],[3,1],[3,2],[0,3]] ``` 得到了一個(gè)有環(huán)圖,那么這就不是一個(gè)排序了

圖2 非拓?fù)渑判蚴疽鈭D 很簡(jiǎn)單吧~接下來只判斷給定的輸入能否構(gòu)成拓?fù)渑判?#xff0c;可以的話輸出拓?fù)湫蛄?#xff0c;不可以的話輸出空即可。 那么,如何判斷呢?這就可以根據(jù)入度(indegree)來判斷了。所謂入度,就是構(gòu)成有向圖之后,指向各個(gè)節(jié)點(diǎn)的邊數(shù)。 具體步驟是,我們每次去掉入度為0的點(diǎn),將該點(diǎn)加入拓?fù)渑判?#xff0c;同時(shí)刪去與其連接的邊(其它節(jié)點(diǎn)的入度會(huì)受到影響),直到去掉所有的點(diǎn)為止,如果中途遇到不存在入度為0的點(diǎn)的情況,那么,就認(rèn)為這個(gè)有向圖不是拓?fù)渑判虻摹?比如圖1可以如下操作

圖3 拓?fù)渑判驙顟B(tài)圖 而圖2中則直接找不到入度為0的點(diǎn),認(rèn)為是非拓?fù)渑判颉?

源代碼

下面是一個(gè)基于BFS的拓?fù)渑判蛩悸?#xff0c;其實(shí)也不能說是嚴(yán)格意義上的BFS,只是有點(diǎn)像~

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

總結(jié)

以上是生活随笔為你收集整理的从LeetCode 210. Course Schedule II 了解拓扑排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。