演算法學習筆記(拓撲排序)

2022-06-28 01:00:14 字數 878 閱讀 4881

拓撲排序,在我現在看來,就是用來解決一系列分層次執行的問題。什麼意思呢?舉個例子(oi-wiki上看到的),比如說我們大學生都要面臨選課問題,那麼某些課程會有一些先行課程,必須先修這些先行課程才能夠繼續修讀某課程,那麼現在問題來了,小明有n種課程需要選讀,n種課程之中,有一些課程有先後關係(也就是說修讀某課程之前必須修它的先修課程,當然如果這個課程沒有先修課程那就可以直接修讀)小明每個學期都可以修若干門課程,但是只能修讀那些沒有先行課程或者先行課程已經在之前的學期中修讀的課程(有點繞),問他修完這n門課至少需要多少個學期?或許此時你已豁然開朗想出一套演算法並迅速實現,那請你關掉這個頁面,或許你毫無頭緒不知道怎麼解決

其實可能接觸過圖論的人會想到,建圖連邊,乙個結點如果沒有入度那不就可以修了嗎?

確實這種想法很正確,接下來說說拓撲排序的常見實現:

首先,我們用乙個佇列維護

我們先把入度為0的結點放入佇列中,然後把這個佇列中結點連出去的邊刪掉

再依次類推。**實現很簡單,我們在建圖的時候就可以統計一下入度了,然後刪邊其實就是找到邊的另乙個端點,把它的入度--就可以了

by the way,個人圖論很喜歡用鏈式前向星建圖,不喜勿噴

喜聞樂見**展示

void

topo()

}}

但是這樣子統計不了層數呀

所以我們也可以換個寫法,用棧去維護

do

}for(int i = 1;i <= top;i ++)

}ans ++;

}while(top);

做兩道好題試試水

演算法學習筆記 19 拓撲排序

計算拓撲序列的乙個方式是,用bfs來嘗試訪問所有的節點,但是有乙個約束就是只有入度為0 00的節點才能被加入到擴充套件佇列裡。每次從佇列裡取出乙個節點,也就同時在圖中將這個節點拆除,所以它的所有後繼的節點都減少1 11,如果已經減少到0 00,那麼就可以加入到佇列中。在上面的例子中,一開始只有a a...

演算法學習 拓撲排序

相關例題 要理解拓撲排序,首先需要知道圖論的乙個基本概念 入度 有向圖中某點作為圖中邊的終點的次數之和 某點的入邊條數 與之相對的是出度 出度 有向圖中某點作為圖中邊的起點的次數之和 某點的出邊條數 拿上面那張圖來說,a和b兩點的出度均為1,入度為0,而c點的入度為2 在前面已經說過,我們將每一項工...

演算法學習 拓撲排序(佇列應用)

題目 分析 乙個節點沒有節點指向 即入度為0 的時候可以順利輸出,如果有則不能。可以用鄰接矩陣的方式來儲存現有的圖,將某節點列下所有的相加後如果等於0這說明當前結點可輸出。這裡給出關鍵 和注釋 int graph 12 12 結點數為n,用鄰接矩陣graph n n 儲存邊權 int indegre...