拓撲排序的簡單認識

2021-10-23 02:22:33 字數 1426 閱讀 6761

拓撲排序可以說是圖結構中的一種,而這裡的權的作用是用來標記。拓撲排序的物件可以說是乙個有向無環圖,而拓撲排序是用來對圖中相連兩點之間的關係進行排列,比如三個點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的節點一定是根節點,這時我們只要將其輸出,並且拆除所有與根節點相連的邊就行了 拆的時候別忘...