程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 1285 拓撲排序

hdu 1285 拓撲排序

編輯:C++入門知識

最簡單的拓撲排序   拓撲排序方法如下:   (1)從有向圖中選擇一個沒有前驅(即入度為0)的頂點並且輸出它.   (2)從網中刪去該頂點,並且刪去從該頂點發出的全部有向邊.   (3)重復上述兩步,直到剩余的網中不再存在沒有前驅的頂點或者所有的點都排序完畢為止. [cpp]   #include<stdio.h>   #include<string.h>   #define N 505   int map[N][N],index[N],used[N],n,m;   //map表示鄰接矩陣,index記錄入度,used記錄是否排序   void toposort()   {    int i,j,topo=0;    while(topo<n){     for(i=1;i<=n;i++){      if(index[i]==0&&used[i]==0){//i從小到大,號碼小的優先       used[i]=1;break;//刪除入度為0的點      }     }     if(i==n+1)return;//如果沒有入度為一的點則結束     if(topo)      printf(" ");     printf("%d",i);     topo++;     for(j=1;j<=n;j++){//將所有以 i 為起點的邊刪除      if(map[i][j]==1){       map[i][j]=0;       index[j]--;      }     }    }   }   int main()   {    int i,a,b;    while(scanf("%d%d",&n,&m)!=EOF){     memset(map,0,sizeof(map));     memset(index,0,sizeof(index));     memset(used,0,sizeof(used));     for(i=1;i<=m;i++){      scanf("%d%d",&a,&b);      if(map[a][b]==0){//考慮重邊的情況       map[a][b]=1;       index[b]++;      }     }     toposort();     printf("\n");    }    return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved