1. 程式人生 > >圖的算法專題——拓撲排序

圖的算法專題——拓撲排序

所有 num ons while tor pre print topo sort

拓撲排序


主要應用:判斷某個圖是否為有向無環圖,若有環則拓撲排序必定失敗。

算法流程:

(1) 遍歷所有頂點,將入度為0的頂點入隊

(2) 按入隊順序依次輸出頂點,並每次將該頂點所連的頂點入度減1,若減完後入度變為0就入隊,加入拓撲序列頂點數加一。

(3) 若num==n 說明拓撲排序成功。

 1 const int MAXV=1010;
 2 vector<int> G[MAXV];
 3 int n,m,inDegree[MAXV];
 4 bool topologicalsort(){
 5     int num=0;
 6     queue<int> q;
 7
for(int i=0;i<n;i++){ 8 if(inDegree[i]==0){ 9 q.push(i); 10 } 11 } 12 while(!q.empty()){ 13 int top=q.front(); 14 //printf("%d",u); 15 q.pop(); 16 for(int i=0;i<G[u].size();i++){ 17 int v=G[u][i]; 18 inDegree[v]--;
19 if(inDegree[v]==0){ 20 q.push(v); 21 } 22 } 23 num++; 24 } 25 if(num==n) return true; 26 else return false; 27 }

若有多個入度為零的頂點時,題目要求選擇最小編號頂點,可以將queue改為priority_queue。

圖的算法專題——拓撲排序