一.關於拓撲排序的背景
根據我的的理解,一些事件的發生順序是互相聯絡的,比如事件a需要在事件b發生完畢之後才可能發生,可以說b是a的前驅事件。
例如大學中的課程設定,要學習演算法設計這麼課程,就要先學習資料結構。因此,我們上課的順序是依賴某些課程之間的關係的,當然,這種順序並不唯一,例如計算機網路和計算機組成原理之間沒有先後關係。
但我們學習課程仍然要一定的順序,計算機網路可能先學,計算機組成原理也可能先學。
抽象出來,這些課程就是圖中的點,有向的邊表示了這種前驅關係。
我們需要根據」圖「來生成一種線性的順序,當然,可能不唯一,但只要其中一種即可。
需要注意的是,這種情況下,圖中不能有環路,假設要學計算機組成原理必須先學作業系統,要學作業系統又必須先學計算機網路,要學計算機網路有要學計算機組成原理(假設)那麼,我們就不知道該從哪門學起。所以圖中不能有環路,而且容易想到,必定至少有乙個點是入度為0的,也就是說必須有某門課程不需要先學其它課程,這樣我們才能開始學習。
二.演算法設計
如剛才所述,我們可以先找到乙個入度為零的點,這個點自然是將要生成順序的第乙個點。然後將這個點刪除,由這個點出發的邊也刪除,然後尋找下乙個入度為零的點。(剩下的圖也必然為有向無環圖)可以以佇列的方式儲存,先將點1加入佇列,將點1的出邊刪除,然後將新的入度為0的點加入佇列,再讓點1出隊,如此迴圈,直到隊列為空。依次出隊的點儲存,即為乙個拓撲順序。
至於圖,用二維矩陣儲存
三.用c語言描述
//關於拓撲排序的乙個演算法:起始點必然是入度為零的點,刪除起始點,第二個點也必然是入度為零的點,以此類推,以佇列儲存,隊列為空時,演算法結束
//關於拓撲排序的乙個演算法:起始點必然是入度為零的點,刪除起始點,第二個點也必然是入度為零的點,以此類推,以佇列儲存,隊列為空時,演算法結束
#include
#define max 99999999
int graph[11][11];
void init(int n) //初始化圖
return;
}void get(int m) //輸入圖的函式,傳遞邊的數量
}int is_origin(int n,int clown) //傳遞圖的大小,以及某一列,若該列全部為max(除本身),則說明其它點不能連到該點,即其入度為零,則該列所在的點為乙個起始點
}return flag;
}void deleteedge(int n, int row) //刪除某點的所有出邊
}int main()
; //標記結點是否已在佇列中
int seq[10] = ; //保留拓撲排序的結果
int i,n,m, count = 0;
printf("please input the size of the graph:\n");
scanf("%d",&n);
init(n);
printf("please input the number of the edge:\n");
scanf("%d",&m);
get(m);
//開始尋找入度為零的點
for(i = 1; i <= n; i++)
}while(front != rear) //佇列不為空}}
}if(count != n)
else
getchar();
getchar();
return
0;}
關於拓撲排序
拓撲排序 英文名稱 topological sort 別稱 toposort or topsort 以下進入胡扯時間 正題 排序?a 我有sort!b 我還會桶排!c 我我我!我還會基數排序和計數排序 哇塞!厲害!但是你會這些東西和我拓撲排序有什麼關係 a?b?c?拓撲排序是幹什麼的呢 以上來自36...
拓撲排序筆記
具體的實現 1 找到乙個入度為零的點,把它丟進佇列。2 把這個點以及與這個點相連的邊都刪去。3 重複1 2直到圖為空。對,又有個裸題 poj 2367 genealogical tree鏈結 就是直接把拓撲排序後的序列輸出即可。如下 include include include include u...
筆記 拓撲排序
對於任何有向圖而言,其拓撲排序為其所有結點的乙個線性排序 對於同乙個有向圖而言可能存在多個這樣的結點排序 該排序滿足這樣的條件 對於圖中的任意兩個結點u和v,若存在一條有向邊從u指向v,則在拓撲排序中u一定出現在v前面。拓撲排序常見於判斷有向圖是否有環 統計dag的資訊等。記錄每個節點的入度,把入度...