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

2021-06-23 05:35:34 字數 1965 閱讀 4151

description

有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 

這題為:典型的拓撲排序演算法(鄰接陣形式),可以作為拓撲排序的模板

一種拓撲排序演算法。

該演算法是簡單而直觀的,實質上屬於廣度優先遍歷,因此稱為廣度優先拓撲排序演算法。該演算法包含下列幾個步驟:

[1] 從有向圖中找乙個沒有前趨的結點v,若v不存在,則表明不可進行拓撲排序(圖中有環路),結束(不完全成功);         

[2] 將v輸出;

[3] 將v從圖中刪除,同時刪除關聯於v的所有的邊

[4] 若圖中全部結點均已輸出,則結束(成功),否則轉[1]繼續進行。

input

6 11

5 35 3

5 15 4

5 23 1

3 26 4

6 24 2

4 2

output

5 3 1 6 4 2

#include #include using namespace std;

int n,m;

const int n = 510;

int grid[n][n];

int deg[n];

int topo[n];

void toposort()

} }int k;

for(int i = 1; i <= n; i++)

topo[i] = k;

deg[k] = -1;

for(int j = 1; j <= n; j++)

} }}int main()

toposort();

for(int i = 1; i <= n-1; i++)

printf("%d\n",topo[n]);

} return 0;

}

最近學習了,一種優先佇列的拓撲排序,感覺更好寫

#include #include #include #include using namespace std;

const int n = 510;

int n, m, indeg[n], order[n];

vectorg[n];

void init()

void add(int from, int to)

void bfs()

} int cnt = 0;

while(!que.empty())

} printf("%d", order[0]);

for(int i = 1; i < n; i++)

puts("");

return ;

}int main()

bfs();

} return 0;

}

確定比賽名次 HDU 1285 ,拓撲

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

HDU 1285 確定比賽名次 拓撲排序

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

拓撲排序 HDU 1285 確定比賽名次

g 確定比賽名次 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從...