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

2021-08-06 06:28:47 字數 920 閱讀 2799

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

輸入有若干組,每組中的第一行為二個數n(1<=n<=500),m;其中n表示隊伍的個數,m表示接著有m行的輸入資料。接下來的m行資料中,每行也有兩個整數p1,p2表示即p1隊贏了p2隊。

給出乙個符合要求的排名。輸出時隊伍號之間有空格,最後一名後面沒有空格。

其他說明:符合條件的排名可能不是唯一的,此時要求輸出時編號小的隊伍在前;輸入資料保證是正確的,即輸入資料確保一定能有乙個符合要求的排名。

4 3

1 22 3

4 3

1 2 4 3

#include#includeint n,m,map[510][510],num[510],flag[510];

/*拓撲排序的結果存在3種情形:

(1)如果該圖存在環,那麼給定的關係肯定是互相矛盾的。

(2)如果不存在環,但是拓撲排序結束後(所有的邊都已經掃瞄完畢),排序得到的序列中元素的個數小於給定的元素個數,那麼給定的關係不足以判斷出全部元素的大小關係。

(3) 如果拓撲排序出來的序列中元素的個數等於給定的元素個數,那麼給出的關係可以判斷出全部元素的大小關係。

拓撲排序方法如下:

(1)從有向圖中選擇乙個沒有前驅(即入度為0)的頂點並且輸出它.

(2)從網中刪去該頂點,並且刪去從該頂點發出的全部有向邊.

(3)重複上述兩步,直到剩餘的網中不再存在沒有前趨的頂點為止.

*/void topsort()//拓撲排序 }}

int main()

} topsort();

for(i=1;i

HDU1285 確定比賽名次

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

hdu 1285 確定比賽名次

解題 拓撲排序 是對有向無環圖的一種排序。表示了頂點按邊的方向出現的先後順序。如果有環,則無法表示兩個頂點的先後順序。乙個簡單的求拓撲排序的演算法 首先要找到任意入度為0的乙個頂點,刪除它及所有相鄰的邊,再找入度為0的頂點,以此類推,直到刪除所有頂點。頂點的刪除順序即為拓撲排序。性質 1 拓撲排序在...

hdu 1285 確定比賽名次

因為輸入資料一定有解,並且要編號小的隊伍在前,那麼用優先佇列儲存結果集即可。拓撲排序關鍵在於需要維護乙個入度為0的頂點的集合。只出不入 include include include include define max 510 using namespace std struct adj adj ...