拓撲排序 確定比賽名次

2021-10-04 11:21:57 字數 1562 閱讀 2597

hdu 3342,1285

1285題目

有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

431

2234

3

sample output

124

3

拓撲排序思想:把所有度為0的節點加入佇列,從任意度為0的節點開始(看題目要求)把他從圖中去掉,然後將與其相鄰的節點的入度減少一,如果有乙個節點度為0,則繼續加入佇列,在迴圈結束後,如果拓撲排序的數字個數等於n,則表示為有向無環圖,否則,不是有向無環圖。然後這道題目中最為關鍵的是需要乙個拓撲序列的最小值,即每次都需要從佇列中取出度為0的最小數,因此可以使用優先佇列,過載最小值即可。

前期準備

1、vector實現鄰間表

vector<

int> graph[maxn]

;int indegree[maxn]

;while

(m--

)

2、拓撲排序

void

topologicalsort

(int n)

}}

完整**

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

501;

vector<

int> graph[maxn]

;int indegree[maxn]

;void

topologicalsort

(int n)}}

intmain()

topologicalsort

(n);

cout<}return0;

}

最後,,這題hdu上判斷有點問題,一開始總是提示我格式錯誤,後來發現是因為使用最小值的優先佇列是需要標頭檔案

#include functional ,具體原因我也不懂~~~~~~

這裡的拓撲排序也可以用vector陣列返回序列,我圖方便就直接輸出的,,按理來說vector陣列實現會更好

拓撲排序 確定比賽名次

題目 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 輸入有若干組,每組...