題解 HDU 1285 確定比賽名次

2021-08-28 16:13:53 字數 2386 閱讀 7358

確定比賽名次

題目描述:

有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

4312234

3sample output

1243

這道題就是乙個簡單的拓撲排序,可以順便看一下我的拓撲排序blog

傳送門:

前**如下:還未ac

#include

using

namespace std;

const

int maxn=

100+

5,maxm=

1000+5

;int a[maxn]

[maxn]

,rd[maxn]

,n,m;

intmain()

for(

int i=

1;i<=n;i++

) cout<" ";

rd[k]=-

1;for(

int j=

1;j<=n;j++)if

(a[k]

[j])

rd[j]--;

}return0;

}

問題所在

1.有重邊!!!

2.輸入有無數個,要用while(cin>>n>>m) 233333

3.陣列開小了,原陣列定義範圍:100+5,現定義500+500

4.每一次陣列都要清零

所以,改進後**,已ac:

#include

using

namespace std;

const

int maxn=

500+

5,maxm=

1000+5

;int a[maxn]

[maxn]

,rd[maxn]

,n,m;

intmain()

for(

int i=

1;i<=n;i++)if

(icout<" ";

else

cout

1;for(

int j=

1;j<=n;j++)if

(a[k]

[j])

rd[j]--;

}}return0;

}

至於注釋內其他的情況,參上乙個錯誤**內的注釋即可。

#include

using

namespace std;

const

int maxn=

510;

vector<

int>e[maxn]

;int rd[maxn]

;priority_queue <

int> q;

intmain()

int f=

1,l=0;

for(

int i=

1;i<=n;i++)if

(rd[i]==0

)q.push

(-i)

;int k=q.

top()*

-1; q.

pop();

printf

("%d"

,k);

for(

int i=

0;i.size()

;i++

)while

(!q.

empty()

)}cout<}return0;

}

這道題就到此結束吧!!!

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 ...