1. 程式人生 > >杭電 1285 確定比賽名次(拓撲排序)

杭電 1285 確定比賽名次(拓撲排序)

hdu -h 整數 click tro hit pro set 接下來

http://acm.hdu.edu.cn/showproblem.php?pid=1285

確定比賽名次

Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11664????Accepted Submission(s): 4644
Problem 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 2
2 3
4 3


Sample Output
1 2 4 3

拓撲排序模板題:
?AC代碼:
#include<stdio.h>  
#include<iostream>  
using namespace std;  
int map[505][505],pre[505];  
int c[505];  
int n,m;  
void topsort()  
{  
    int i,j,k,p=1;  
    for(i=1;i<=n;i++)  
    {  
        for(j=1;j<=n;j++)  
        {  
            if(pre[j]==0)     // 假設該頂點入度為0  
            {  
                pre[j]--;     //刪除該頂點,即該頂點入度減一  
                c[p++]=j;     //刪除元素儲存到c[]數組中  
                for(k=1;k<=n;k++)   
                {  
                    if(map[j][k]==1)  //推斷該頂點j與哪些點相連  
                        pre[k]--;     //若相連。則刪除該邊,即把與頂點j相連那點的入度減一  
                }  
                break;  
            }  
        }  
    }  
}  
  
int main ()  
{  
    int a,b,i;  
    while(~scanf("%d%d",&n,&m))  
    {  
        memset(pre,0,sizeof(pre));  
        memset(map,0,sizeof(map));  
        for(i=0;i<m;i++)  
        {  
            scanf("%d%d",&a,&b);  
            if(map[a][b]==0)    // 要考慮重邊情況  
            {  
              map[a][b]=1;  
              pre[b]++;  
            }  
        }  
  
        topsort();  
        for(i=1;i<=n;i++)  
        {  
            if(i!=n)  
                printf("%d ",c[i]);  
            else  
                printf("%d\n",c[i]);  
        }  
    }  
    return 0;  
}




杭電 1285 確定比賽名次(拓撲排序)