【題解】HDU 1285——確定比賽名次
阿新 • • 發佈:2018-12-13
確定比賽名次
題目描述:
有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 2
2 3
4 3
Sample Output
1 2 4 3
#include <bits/stdc++.h>
using namespace std;
const int maxn=100+5,maxm=1000+5;
int a[maxn][maxn],rd[maxn],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
a[x][y]=1;
rd[ y]++;
}
for(int i=1;i<=n;i++){
int k;
for(int j=1;j<=n;j++)
if(rd[j]==0){
k=j;
break;
}
cout<<k<<" ";
rd[k]=-1;
for(int j=1;j<=n;j++)
if(a[k][j])
rd[j]--;
}
return 0;
}
問題所在 1.有重邊!!! 2.輸入有無數個,要用while(cin>>n>>m) 233333 3.陣列開小了,原陣列定義範圍:100+5,現定義500+500 4.每一次陣列都要清零
#include <bits/stdc++.h>
using namespace std;
const int maxn=500+5,maxm=1000+5;
int a[maxn][maxn],rd[maxn],n,m;
int main(){
while(cin>>n>>m){//不停地讀入
memset(a,0,sizeof(a));//一波清零的操作
memset(rd,0,sizeof(rd));
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
if(a[x][y])//重邊的情況2333
continue;//繼續就是了
a[x][y]=1;
rd[y]++;
}
for(int i=1;i<=n;i++){
int k;
for(int j=1;j<=n;j++)
if(rd[j]==0){
k=j;
break;
}
if(i<n)
cout<<k<<" ";
else
cout<<k<<endl;
rd[k]=-1;
for(int j=1;j<=n;j++)
if(a[k][j])
rd[j]--;
}
}
return 0;
}
至於註釋內其他的情況,參上一個錯誤程式碼內的註釋即可。 這道題就到此結束吧!!!