HDOJ 1285 確定比賽名次

2021-07-16 05:14:37 字數 1435 閱讀 9787

確定比賽名次

time limit:1000msmemory limit:32768kb64bit io format:%i64d & %i64u

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、每個頂點出現且只出現一次;

2、若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。那麼就稱該序列是該圖的乙個拓撲排序。

解題思路:當p1戰勝p2的時候那麼p2的前驅就是p1,p2前驅的數量就增加1。用乙個陣列

indegree(初始化為0)

來儲存每個點

的前驅數量;前驅為0的自然就是第一名。找到第一名後輸出,然後再把第一名刪除掉,其餘前驅相應減一,這時第二名就變成了第一名,以此類推。。

#include#include#includeusing namespace std;

int map[505][505];//判斷兩支隊伍是否進行了比賽

int n,indegree[505];//記錄該隊伍的前驅個數

int queue[505];//記錄所有隊伍的排名

void tuopu()

} queue[k++]=top;//儲存當前第一名後,下乙個「第一」就是k+1

indegree[top]=-1;//第一名入儲存後,刪除

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

} for(int i=0;iprintf("%d ",queue[i]);

printf("%d\n",queue[n-1]);//輸出格式

}int main()

} tuopu();

} return 0;

}

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

中文題,不解釋。這是我的第一道拓撲排序題,先來講一下什麼是拓撲排序 拓撲排序其實就是如果要進行某一項活動的時候,它的基礎活動要先進行。比如說,學概率論之前必須要學會高等數學,那麼高等數學就是學概率論的前提條件,這就牽涉到先後課程怎麼學習,就是誰先學誰後學習,拓撲排序就是解決這類問題的。題目鏈結 in...

HDU1285 確定比賽名次

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

hdu 1285 確定比賽名次

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