zoukankan      html  css  js  c++  java
  • Hdu

    先上题目

    确定比赛名次

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


    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
     
     
     
      题目很简单,就是一条拓扑排序,只是不确定前后关系的时候按照编号的大小,从小到大排一次,这里只需要用优先队列即可,当然,也可以不使用优先队列,只是考虑到时间复杂度,以及优先队列可以直接调用STL。用它定义好的算子也可以,我这里用的是自己写的算子。
      这一题最让人意想不到的地方就是有重边,就是同一条边读了两次,如果处理不好就会出错。因为这里wa了两次= =。看来以后遇到拓扑排序要注意一下位置。
     
    上代码:
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #define MAX 550
     5 using namespace std;
     6 
     7 int s[MAX][MAX];
     8 
     9 
    10 struct cmp
    11 {
    12     bool operator() (int x,int y)
    13     {
    14         return x>y;
    15     }
    16 };
    17 
    18 priority_queue<int , vector<int>,cmp > p;
    19 
    20 
    21 void deal(int n)
    22 {
    23     int i,j;
    24     queue<int> q;
    25     for(i=1;i<=n;i++) if(!s[i][0]) p.push(i);
    26     while(!p.empty())
    27     {
    28         i=p.top();
    29         q.push(i);
    30         p.pop();
    31         for(j=1;j<=n;j++)
    32         {
    33             if(s[i][j])
    34             {
    35                 s[j][0]--;
    36                 if(!s[j][0]) p.push(j);
    37             }
    38         }
    39     }
    40     i=0;
    41     while(!q.empty())
    42     {
    43         if(i++) printf(" ");
    44         printf("%d",q.front());
    45         q.pop();
    46     }
    47     printf("
    ");
    48 }
    49 
    50 int main()
    51 {
    52     int n,m,i,x,y;
    53     while(scanf("%d %d",&n,&m)!=EOF)
    54     {
    55         memset(s,0,sizeof(s));
    56         for(i=0;i<m;i++)
    57         {
    58             scanf("%d %d",&x,&y);
    59             if(s[x][y]) continue;
    60             s[x][y]=1;
    61             s[y][0]++;
    62         }
    63         deal(n);
    64     }
    65     return 0;
    66 }
    1285
  • 相关阅读:
    一些Asp.Net面试题答案
    未能加载文件或程序集"Microsoft.Web.Infrastructure 的解决方案
    偶然的发现(与Code无关)
    配置一台测试机 每个域用户独立会话
    使用 Git 和 Visual Studio Online 进行版本控制
    1.大数据概述
    递归下降语法分析程序设计
    文法 LL1
    C语言的文法分析
    词法分析
  • 原文地址:https://www.cnblogs.com/sineatos/p/3191748.html
Copyright © 2011-2022 走看看