確定比賽名次
題目描述:
有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 ...