• hdu-1285确定比赛名次---拓扑排序


     1 #include<stdio.h>
     2 #include<string.h>
     3 #define N 505
     4 int map[N][N],in[N],s[N];
     5 int n;
     6 int topsort()
     7 {
     8     int i,j;
     9     for(i=1;i<=n;i++)
    10     {
    11         for(j=1;j<=n;j++)
    12         {
    13             if(map[i][j])
    14             in[j]++;//查找入度
    15         }
    16     }
    17     for(i=1;i<=n;i++)
    18     {
    19         j=1;
    20         while(in[j]) j++;
    21         s[i]=j;
    22         in[j]--;
    23         for(int r=1;r<=n;r++)
    24         {
    25             if(map[j][r]) in[r]--;
    26         }
    27     }
    28 }
    29 int main()
    30 {
    31     int m,x,y,i;
    32     while(~scanf("%d%d",&n,&m))
    33     {
    34         memset(map,0,sizeof(map));
    35         memset(in,0,sizeof(in));
    36         for(i=0;i<m;i++)
    37         {
    38             scanf("%d%d",&x,&y);
    39             map[x][y]=1;
    40         }
    41         topsort();
    42         for(i=1;i<n;i++)
    43             printf("%d ",s[i]);
    44         printf("%d
    ",s[n]);
    45     }
    46 }
    View Code

    确定比赛名次

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 7669    Accepted Submission(s): 2952


    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
  • 相关阅读:
    WEEK
    更新yum源
    Centos6.9安装Mysql5.7.18
    gitlab使用
    gitlab安装
    git客户端
    服务器端配置
    错误问题
    服务器端
    01找出数组中重复的数
  • 原文地址:https://www.cnblogs.com/zsj-93/p/3173375.html
Copyright © 2020-2023  润新知