最簡單的拓撲排序
拓撲排序方法如下: (1)從有向圖中選擇乙個沒有前驅(即入度為0)的頂點並且輸出它. (2)從網中刪去該頂點,並且刪去從該頂點發出的全部有向邊. (3)重複上述兩步,直到剩餘的網中不再存在沒有前驅的頂點或者所有的點都排序完畢為止.
[cpp]
#include
#include
#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
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;
hdu1285(拓撲排序)
拓撲排序簡單來說就是把乙個圖的所有節點排序,使得每一條有向邊 u,v 對應的u都排在v的前面。拓撲排序最大的用途就是判斷乙個有向圖是否有環,當然判斷還有一種方法就是floyd演算法。如果用鄰接表的話拓撲排序的時間複雜度是o n e 鄰接矩陣是o n 2 n表示頂點數,e表示邊數,floyd時間複雜度...
hdu 1285(拓撲排序)
題意 給各個隊間的勝負關係,讓排名次,名詞相同按從小到大排。解析 拓撲排序是應用於有向無迴路圖 direct acyclic graph,簡稱dag 上的一種排序方式,對乙個有向無迴路圖進行拓撲排序後,所有的頂點形成乙個序列,對所有邊 u,v 滿足u 在v 的前面。該序列說明了頂點表示的事件或狀態發...
HDU1285 拓撲排序
拓撲排序的水題,題意是確定比賽的名次,每一次將輸的人的入度加一,然後就是拓撲排序的模板套路了,記住輸入的時候可能有重邊,貼 include include include include using namespace std int map 600 600 head 600 hash 600 in...