• 确定比赛名次


    确定比赛名次

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
    Total Submission(s) : 4   Accepted Submission(s) : 2

    Font: Times New Roman | Verdana | Georgia

    Font Size:  

    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

    思路:拓扑排序,是对于有向无环图而言的,或者说不是这种图不存在拓扑排序。算法:首先找入度为0的点且最小的点,输出该点,然后把与该点有关的且把该点作为入度的点的入度减少1,并且把该点和该边销毁,循环以上步骤,直到最后把所有的点找完,或者已找不到入度为0的点为止。
     1 #include<stdio.h>
     2 #include<string.h>
     3 int degree[505],vis[505],map[501][501];
     4 int main()
     5 {
     6     int n,m,a,b,i,j,min;
     7     while(~scanf("%d%d",&n,&m))
     8     {
     9         memset(degree,0,sizeof(degree));
    10         memset(vis,0,sizeof(vis));
    11         memset(map,0,sizeof(map));
    12         while(m--)
    13         {
    14             scanf("%d%d",&a,&b);
    15             if(!map[a][b])        //重边不计!(此题测试数据有重边);
    16             {
    17                 degree[b]++;
    18                 map[a][b] = 1;
    19             }
    20         }
    21         min = 501;
    22         for(i = 0;i < n;i ++)
    23         {
    24             for(j = 1;j <= n;j ++)    //寻找入度为0且编号最小的边;
    25             {
    26                 if(degree[j] == 0 && j < min && vis[j] == 0)
    27                     min = j;
    28             }
    29            vis[min] = 1;    //把该点销毁;
    30            if(i != n-1)
    31                 printf("%d ",min);
    32            else
    33                 printf("%d
    ",min);
    34            for(j = 1;j <= n;j ++)         //  处理与该点相关的并以该点作为入度的所有点;
    35            {
    36                 if(j != min && vis[j] == 0)
    37                 {
    38                     if(map[min][j] == 1)
    39                     {
    40                          degree[j]--;
    41                          map[min][j] = 0;    //销毁边;
    42                     }
    43                 }
    44            }
    45            min = 501;
    46         }
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    facebook开源前端UI框架React初探
    javascript中数组的map方法
    处理 InterruptedException——Brian Goetz
    eclipse 打开是报错"reload maven project has encountered a problem"
    Java并发大师Brain Goetz和Doug Lea 的中英文博客文章地址
    修复 Java 内存模型,第 2 部分——Brian Goetz
    修复 Java 内存模型,第 1 部分——Brian Goetz
    正确使用 Volatile 变量——Brian Goetz
    mysql数据备份
    小知识点
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3372837.html
Copyright © 2020-2023  润新知