由某個集合上的一個偏序得到該集合上的一個全序,這個操作被稱為拓撲排序。偏序和全序的定義分別如下:
若集合X上的關系R是自反的、反對稱的和傳遞的,則稱R是集合X上的偏序關系。
設R是集合X上的偏序,如果對每個x,y∈X必有xRy或yRx,則稱R是集合X上的全序關系。
由偏序定義得到拓撲有序的操作便是拓撲排序。
拓撲排序的流程如下:
1. 在有向圖中選一個沒有前驅(qū)的頂點并且輸出之;
2. 從圖中刪除該頂點和所有以它為尾的弧。
重復上述兩步,直至全部頂點均已輸出,或者當前圖中不存在無前驅(qū)的頂點為止。后一種情況則說明有向圖中存在環(huán)。
采用鄰接表存儲有向圖,并通過棧來暫存所有入度為零的頂點,可以描述拓撲排序的算法如下:
在本題中,讀入一個有向圖的鄰接矩陣(即數(shù)組表示),建立有向圖并按照以上描述中的算法判斷此圖是否有回路,如果沒有回路則輸出拓撲有序的頂點序列。