zoukankan      html  css  js  c++  java
  • hdu 1285 确定比赛名次 (topsort)

    确定比赛名次
    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 36309    Accepted Submission(s): 14221

    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

    C/C++:

     1 #include <map>
     2 #include <queue>
     3 #include <cmath>
     4 #include <vector>
     5 #include <string>
     6 #include <cstdio>
     7 #include <cstring>
     8 #include <climits>
     9 #include <iostream>
    10 #include <algorithm>
    11 #define INF 0xffffff
    12 using namespace std;
    13 
    14 const int my_max_N = 505;
    15 int my_indeg[my_max_N], n, m, a, b;
    16 vector <int> my_G[my_max_N];
    17 
    18 void topsort()
    19 {
    20     queue <int> Q, ans;
    21 
    22     while (1)
    23     {
    24         for (int i = 1; i <= n; ++ i)
    25             if (my_indeg[i] == 0)
    26             {
    27                 Q.push(i), ans.push(i);
    28                 my_indeg[i] = -1;
    29                 break;
    30             }
    31 
    32         if (Q.empty()) break;
    33         while (!Q.empty())
    34         {
    35             int my_now = Q.front();
    36             for (int i = 0; i < my_G[my_now].size(); ++ i)
    37                 -- my_indeg[my_G[my_now][i]];
    38             my_G[my_now].clear();
    39             Q.pop();
    40         }
    41     }
    42 
    43     /**
    44         Answer Output
    45     */
    46     printf("%d", ans.front());
    47     ans.pop();
    48     while (!ans.empty())
    49     {
    50         printf(" %d", ans.front());
    51         ans.pop();
    52     }
    53     printf("
    ");
    54 }
    55 
    56 int main()
    57 {
    58     while (~scanf("%d%d", &n, &m))
    59     {
    60         memset(my_indeg, 0, sizeof (my_indeg));
    61 
    62         while (m --)
    63         {
    64             scanf("%d%d", &a, &b);
    65             my_G[a].push_back(b);
    66             ++ my_indeg[b];
    67         }
    68 
    69         topsort();
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    php目录递归删除
    php嵌套数据
    HTML 标签
    枚举 递归
    传值传址 结构体
    去超市选择要购买的商品 将数组放入集合
    函数
    集合 ArrayList 类
    特殊集合 Stack Queue Hashtable
    二维数组,多维数组
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9457003.html
Copyright © 2011-2022 走看看