拓撲排序(定義):
對於有向圖的節點按照訪問順序排序,最終形成乙個線性序列(該序列滿足:每個頂點出現且只出現一次)
不難發現:如果圖中存在有向環,則不存在拓撲排序
拓撲排序(演示)
**參考《演算法競賽入門經典(第2版)》
int c[maxn]
;//c[u]=0表示沒有訪問過,c[u]=1表示已經訪問過,c[u]=-1表示正在訪問
int topo[maxn]
,t;//陣列模擬棧,t是頂點總數
bool
dfs(
int u)
}//如果前面都沒有返回,說明從u開始的有向圖沒有環
//訪問標誌設為1
//在訪問完乙個節點之後把它加到當前拓撲排序的首部
//從u開始的dfs,生成乙個u在首部的topo陣列(此時的topo陣列不一定包括所有節點,因此toposort()函式仍然需要遍歷所有節點)
c[u]=1
; topo[
--t]
= u;
return
true;}
bool
toposort()
}return
true
;}
不難理解,將入度為0的頂點壓入佇列,該頂點指向的頂點的度數-1
**參考:拓撲排序入門(真的很簡單)
queue<
int>q;
vector<
int>edge[n]
;for
(int i=
0;i)//n 節點的總數
if(in[i]==0
) q.
push
(i);
//將入度為0的點入佇列
vector<
int>ans;
//ans 為拓撲序列
while
(!q.
empty()
)}if(ans.
size()
==n)
else
printf
("no answer!\n");
// ans 中的長度與n不相等,就說明無拓撲序列
拓撲排序模板
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...