拓?fù)渑判虻哪繕?biāo)是能夠處理DAG的頂點,讓每個頂點在它指向的所有頂點被處理
之前被處理 。排序結(jié)果使得圖上節(jié)點的非線性序轉(zhuǎn)化為線性序,但節(jié)點的排列順序
依然遵循原圖上節(jié)點前驅(qū)與后繼的傳遞性。

       因為要做n個頂點的n次棧操作+e次入度減一運算,所以總的時間復(fù)雜度為O(n+e)。

int ToPologicalSort(int n,int degree[],Edge _edgeArr[]){
 Edge tmpNod;
 
int l,top=-1;
 
 RecordInDegree(n,degree,_edgeArr);  
// 記錄各節(jié)點入度數(shù)

 
for(int i=0;i<n;i++)
    
if(degree[i]==0){
       degree[i]
=top;  // 在原數(shù)組構(gòu)造棧,入度為0節(jié)點壓棧
       top=i;
    }

      
 
  
for(int i=0;i<n;i++){
     
if(top==-1){ printf("成環(huán)\n"); return 0;} //棧空,節(jié)點有剩余,成環(huán)
     l=top;
     top
=degree[top];
     printf(
"%d ",l);
    
     tmpNod
=_edgeArr[l];
     
while(tmpNod){
       
if(--degree[tmpNod->v]==0){  // 對應(yīng)相鄰節(jié)點入度減一,為0則壓棧
         degree[tmpNod->v]=top;
         top
=tmpNod->v;
       }

       tmpNod
=tmpNod->link;
     }

  }

}


void RecordInDegree(int n,int degree[],Edge _edgeArr[]){
   Edge tmpNod; 
int i;
   
for(i=0;i<n;i++){
      tmpNod
=_edgeArr[i];
      
while(tmpNod){
          degree[tmpNod
->v]++;  // i相鄰后繼入度加一
          tmpNod=tmpNod->link;
      }

   }

}