LC210 BFS拓撲排序

2021-10-22 17:07:51 字數 1166 閱讀 8011

題目

現在你總共有 n 門課需要選,記為 0 到 n-1。

在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用乙個匹配來表示他們: [0,1]

給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。

可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完成所有課程,返回乙個空陣列。

思路包含 n個節點的有向圖 gg,拓撲排序,判斷是否有環,若有環則返回空陣列

參考解題:

class

solution

// 1.建立鄰接表,儲存某個節點能夠到達的其他節點集合, 即儲存每門課程對應的後續課程

hashset

adj =

newhashset

[numcourses]

;for

(int i =

0; i < numcourses; i++

)// 2.入度陣列:通過結點的索引,我們能夠得到指向這個結點的結點個數。

int[

] indegree =

newint

[numcourses]

;for

(int

p:prerequisites)

// 3.新建佇列,將所有入度為0的節點先進入佇列

queue

queue =

newlinkedlist

<

>()

;for

(int i =

0; i < numcourses; i++)}

//4. 當佇列非空,就從隊首取出入度為0的結點,將這個結點輸出到結果集中,並且將這個結點的所有鄰接結點(它指向的結點)的入度減1,在減1以後,如果這個結點的入度為0,就繼續入隊。

int[

] res =

newint

[numcourses]

;int count =0;

while

(!queue.

isempty()

)}}//5. 當隊列為空的時候,檢查結果集中的頂點個數是否和課程數相等即可。

if(count == numcourses)

return

newint[0

];}}

拓撲排序的DFS和BFS

博主以前有乙個疑問,dfs和bfs各自的適用範圍是?我想你今天看了這篇文章之後會有乙個判斷!風格被我改為了c void topsort vector g topnum v counter 第counter 1個被遍歷到的 for int i iif g v i indgree i 用一句話來概括這個...

拓撲排序的DFS和BFS

博主以前有乙個疑問,dfs和bfs各自的適用範圍是?我想你今天看了這篇文章之後會有乙個判斷!風格被我改為了c void topsort vector g topnum v counter 第counter 1個被遍歷到的 for int i iif g v i indgree i 用一句話來概括這個...

TopSort 拓撲排序 中DFS和BFS的應用

深度優先搜尋 下面圖中的數字顯示了深度優先搜尋頂點被訪問的順序。為了實現深度優先搜尋,首先選擇乙個起始頂點並需要遵守三個規則 1 如果可能,訪問乙個鄰接的未訪問頂點,標記它,並把它放入棧中。2 當不能執行規則1時,如果棧不空,就從棧中彈出乙個頂點。3 如果不能執行規則1和規則2,就完成了整個搜尋過程...