1285試合順位決定【トポロジーソート】

2393 ワード

試合の順位を決める
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17239    Accepted Submission(s): 6860
Problem Description
Nチーム(1<=N<=500)があり、番号は1、2、3、...Nは試合を行い、試合が終わった後、審判委員会はすべての参加チームを行った後から順番に順位をつけなければならないが、現在、審判委員会は直接各チームの試合成績を得ることができず、各試合の結果、すなわちP 1がP 2に勝ったことしか知らず、P 1,P 2で表され、順位はP 1がP 2の前にある.今、プログラムを作ってランキングを確定してください.
 
Input
入力にはいくつかのグループがあり、各グループの第1の動作の2つの数N(1<=N<=500)、M;ここで、Nは行列の個数を表し、MはM行に続く入力データを表す.次のM行データでは、行ごとに2つの整数P 1があり、P 2はP 1チームがP 2チームに勝ったことを示す.
 
Output
要件に合致するランキングを与えます.出力時にキュー番号の間にスペースがあり、最後の名前の後ろにスペースがありません.
その他の説明:条件に合致する順位は唯一ではない可能性があります.この場合、出力時の番号の小さいチームが上位にあることが要求されます.入力データは正しいことを保証します.すなわち、入力データは必ず要求に合致するランキングを確保します.
 
Sample Input

   
   
   
   
4 3 1 2 2 3 4 3

 
Sample Output

   
   
   
   
1 2 4 3

トポロジーソート、有向図をソートします.具体的なルールは、入度がゼロの点を優先して、この点が接続されているすべてのエッジを削除して、一度に行うと、ソートの結果が得られます.
この问题は自分で大体理解して、考え方によってプログラムを书いて、まず入度がゼロの点を探し当てて、それから出力して、この点の接続の辺をすべて取り除いて、顺次循环して、相応のシーケンスを出力しました.....
#include<stdio.h>
#include<string.h>
int n,x[505][505],ind[505];
void tpsort()
{
    int i,j,k;
    for(i=0;i<n;++i)//      
    {
        for(j=1;j<=n;++j)//        
        {
            if(ind[j]==0)
            {
                break;//     
            }
        }
        if(i<n-1)//      
        {
            printf("%d ",j);
        }
        else
        {
            printf("%d
",j); } ind[j]=-1;// for(k=1;k<=n;++k)// { if(x[j][k]) { --ind[k];// , 1 } } } } int main() { int m,i,j,a,b; while(~scanf("%d%d",&n,&m)) { memset(x,0,sizeof(x)); memset(ind,0,sizeof(ind)); for(i=0;i<m;++i) { scanf("%d%d",&a,&b); if(!x[a][b])// { x[a][b]=1; ++ind[b]; } } tpsort();// } return 0; }