• hduoj 1285 确定比赛名次


    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): 14739    Accepted Submission(s): 5892


    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代码:

     1 //典型的拓扑排序算法(邻接阵形式),可以作为拓扑排序的模板 
     2 #include <iostream>
     3 //#include <conio.h>
     4 using namespace std;
     5 #define arraysize 501
     6 int map[arraysize][arraysize];   //存储图的临界阵 
     7 int n,m;
     8 int indegree[arraysize];    //存储点的入度 
     9 int main()
    10 {
    11     int i,j,k;
    12     int p1,p2;
    13     //freopen("1.txt","r",stdin);
    14     while(cin>>n>>m)
    15     {
    16         memset(map,0,sizeof(map));
    17         memset(indegree,0,sizeof(indegree));
    18         for(i=0;i<m;++i)
    19         {
    20             cin>>p1>>p2;
    21             if(!map[p1][p2])     //此处别忘了重边的判断,否则会wa 
    22             {
    23                 map[p1][p2] =1;
    24                 indegree[p2]++;     //重边的时候,如果不做处理,度数为计算错误
    25             }            
    26         }
    27         //拓扑排序 
    28         for(i=1;i<n+1;++i)      //进行n次遍历,每次找出一个入度为0的节点              
    29         {
    30             for(j=1;j<n+1;++j)  //遍历所有节点  
    31             {
    32                 if(indegree[j]==0)    //找出入度为0的节点 
    33                 {
    34                     indegree[j]--;    //度数递减,避免下次继续找到 
    35                     if(i!=n)
    36                     {
    37                        cout<<j<<" ";
    38                     }
    39                     else
    40                        cout<<j<<endl;
    41                     for(k=1;k<n+1;++k)
    42                     {
    43                         if(map[j][k]==1)   // 删除与度数为0的节点相关联的边 
    44                         {
    45                             indegree[k]--;
    46                         }
    47                     } 
    48                     break;
    49                 }                             
    50             }
    51         }
    52     }
    53     //getch();
    54     return 0;
    55 }
  • 相关阅读:
    codeforces 368B
    codeforces 651A
    codeforces 651B
    codeforces 732B
    codeforces 313B
    codeforces 550A
    codeforces 498B
    Linux C/C++基础——内存分区
    Linux C/C++基础——变量作用域
    Linux C/C++基础——Windows远程登录Linux
  • 原文地址:https://www.cnblogs.com/jeff-wgc/p/4477247.html
Copyright © 2020-2023  润新知