拓撲排序 及 例題 確定比賽名次

2021-09-17 18:14:33 字數 1624 閱讀 6235

1拓撲排序的實現步驟

1,在有向圖中選乙個沒有前驅的頂點並且輸出

2,從圖中刪除該頂點和所有以它為尾的弧(白話就是:刪除所有和它有關的邊)

3,重複上述兩步,直至所有頂點輸出,或者當前圖中不存在無前驅的頂點為止,後者代表我們的有向圖是有環的,因此,也可以通過拓撲排序來判斷乙個圖是否有環。

2、拓撲排序示例手動實現

如果我們有如下的乙個有向無環圖,我們需要對這個圖的頂點進行拓撲排序,過程如下:

首先,我們發現v6和v1是沒有前驅的,所以我們就隨機選去乙個輸出,我們先輸出v6,刪除和v6有關的邊,得到如下圖結果:

然後,我們繼續尋找沒有前驅的頂點,發現v1沒有前驅,所以輸出v1,刪除和v1有關的邊,得到下圖的結果:

然後,我們又發現v4和v3都是沒有前驅的,那麼我們就隨機選取乙個頂點輸出(具體看你實現的演算法和圖儲存結構),我們輸出v4,得到如下圖結果:

然後,我們輸出沒有前驅的頂點v3,得到如下結果:

然後,我們分別輸出v5和v2,最後全部頂點輸出完成,該圖的乙個拓撲序列為:

v6–>v1—->v4—>v3—>v5—>v2

例題:有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 3

1 22 3

4 3

sample output

1 2 4 3
**如下:

#include#includeusing namespace std;

int g[505][505];

int gree[505];

void tuopu(int n)

} tuopu(n);

cout<

} return 0;

}

拓撲排序 確定比賽名次

題目 description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。...

確定比賽名次 (拓撲排序)

有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。input 輸入有若干組,每組...

確定比賽名次 (拓撲排序)

有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序確定排名。input 輸入有若干組,每組...