1. 程式人生 > >【題解】HDU 1285——確定比賽名次

【題解】HDU 1285——確定比賽名次

確定比賽名次

題目描述:
有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.每一次陣列都要清零

所以,改進後代碼,已AC:

#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;
}

至於註釋內其他的情況,參上一個錯誤程式碼內的註釋即可。 這道題就到此結束吧!!!