拓撲排序是圖論中一種典型的演算法。通過拓撲排序可以梳理圖的層次結構。像什麼工期完成類的圖論任務,就是典型的應用。第二個應用就是判斷圖中是否存在環路的問題。
程式中建圖的方式是鄰接表形式,**如下:
vector
>
graph
(n, vector
);
下面是拓撲排序的模板:
vector
>
graph
(n, vector);
根據所給有向圖的指向關係,完成graph圖的建立
// 統計初始入度為0的
vector
indegree
(n,0);
for(int i=
0; iqueue que;
// 佇列儲存,其實如果對於順序沒有要求棧也行
for(int i=
0; i)while
(!que.
empty()
)}/* 如果要判斷是否存在環路,可以在最後判斷一下indegree陣列,如果全為0說明無環,否則說明有環。
*/
來兩道題練習一下吧!(題目是他人部落格找的,不是**來的。沒有去oj驗證ac,只是通過了樣例測試。輸出格式也沒調,勉強過關吧!)
題目一:確定比賽名次
**如下:
#include.h>
using namespace std;
int main
(void))
;for
(int i=
0; i) vector
indegree
(n,0);
for(int i=
0; isize()
; i++)}
priority_queue que;
// 題目對順序有要求,這裡用了優先佇列
for(int i=
0; i)while
(!que.
empty()
)}return0;
}
題目二:poj 2367:genealogical tree
#include.h>
using namespace std;
int main
(void))
; int i;
for(int j=
0; jvector
indegree
(n,0);
for(int i=
0; iqueue que;
for(int i=
0; i)while
(!que.
empty()
)}return0;
}
參考資料: 拓撲排序模板
include include include include include using namespace std const int maxn 30 int head maxn ip,indegree maxn int n,m,seq maxn struct note edge maxn ma...
模板 拓撲排序
拓撲排序 將 小於 關係看做有向圖,形成一條排好序的關係,可能不唯一。queue實現,vector儲存 const int maxn 10005 int in maxn sum,n,m,fa maxn vectorg maxn void init void toposort 按字典序輸出 改為pri...
拓撲排序模板
演算法步驟 1.從aov網中選擇乙個沒有前驅的頂點 該定點的入度為0 並且輸出它 2.從aov網中選刪除該頂點,並且刪除以該頂點為尾的全部有向邊。3.重複上述兩步,知道剩餘的網中不再存在沒有直接前驅的頂點為止。hdu1285 include include include include inclu...