拓撲排序可以說是圖結構中的一種,而這裡的權的作用是用來標記。拓撲排序的物件可以說是乙個有向無環圖,而拓撲排序是用來對圖中相連兩點之間的關係進行排列,比如三個點a,b,c,三點之間的關係是(a,b)(a,c)(b,c),要保證a在b前面,a在c前面,b在c前面,那麼因此對於a,b,c的排序就稱為拓撲排序,形成的序列稱為拓撲序列。換一種說法就是:由某個集合上的乙個偏序得到該集合上的乙個全序,這個操作稱之為拓撲排序。
拓撲排序簡單的來寫的話,一般需要三個陣列book,a,b,book陣列用來初始化儲存兩點之間的關係,b陣列用來記錄、解除兩點之間的關係,a陣列用來儲存拓撲序列。
可以從以下問題進行了解:
有n個比賽隊(1<=n<=500),編號依次為1,2,3,。。。。,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。
input
輸入有若干組,每組中的第一行為二個數n(1<=n<=500),m;其中n表示隊伍的個數,m表示接著有m行的輸入資料。接下來的m行資料中,每行也有兩個整數p1,p2表示即p1隊贏了p2隊。
output
給出乙個符合要求的排名。輸出時隊伍號之間有空格,最後一名後面沒有空格。
其他說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。
sample input
4 31 2
2 34 3
sample output
1 2 4 3
**如下(效率有點低)
#include
intmain()
;int a[
700]
=,b[
700]=;
int x,y;
for(
int i=
1;i<=n;i++)}
int q,w;
//一層大的for迴圈用來不斷儲存拓撲序列,兩層並列子for迴圈
for(
int i=
1;i<=m;i++)}
a[i]
=q; b[q]=-
1;//解除關係
for(
int k=
1;k<=m;k++)}
}for
(int i=
1;i<=m-
1;i++
)printf
("%d "
,a[i]);
printf
("%d\n"
,a[m]);
}}
簡單的拓撲排序模板
拓撲排序 一.定義 通常,這樣的線性序列稱為滿足拓撲次序 topological order 的序列,簡稱拓撲序列。注意 1 只有有向無環圖才存在拓撲序列 2 對於乙個dag,可能存在多個拓撲序列 如 二.拓撲序列演算法思想 1 從有向圖中選取乙個沒有前驅 即入度為0 的頂點,並輸出之 2 從有向圖...
簡單DP 拓撲排序 拓撲排序 DP兩練
portkey 單源單匯就是最長路 多源單匯就是反一下最長路 多源多匯就是拓撲排序 include using namespace std define in read int in const int n 2e5 5 int n,m,deg n f n vector int g n void to...
hdu 1285 (簡單的拓撲排序)
題意 給出一些隊伍之間的勝負關係,讓你輸出排名的先後順序,如果排名相同則字典序小的先輸出。思路 這是一道裸的拓撲排序的題目。主要用來測一下板子。下面給出幾種不同的版本 判斷的第一種方法 我們可以知道當前入度為0的節點一定是根節點,這時我們只要將其輸出,並且拆除所有與根節點相連的邊就行了 拆的時候別忘...