zoukankan      html  css  js  c++  java
  • HDU-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): 12796    Accepted Submission(s): 5139

    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
     
    Author
    SmallBeer(CML)
     
    Source
    二、拓扑排序+优先队列:
    思路:把依次把出度数为0的加入优先队列中。用数组d【】表示度数。
    map【x】【y】=1表示有边,考虑重边的情况。
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    int d[505],map[505][505];
    priority_queue<int,vector<int>,greater<int> > q;
    void toposort(int n)
    {
      int v,res[505],r,i;
         r=0;
      for(i=1;i<=n;i++)
      {
          if(d[i]==0)
              q.push(i);
      }
      while(!q.empty())
      {
          v=q.top();
         // printf("top=%d
    ",top);
           q.pop();
           res[r++]=v;
            for(i=1;i<=n;i++)
           {
               if(!map[v][i])
                  continue;
                d[i]--;
              if(d[i]==0)
                 q.push(i);
           }
      }
      printf("%d",res[0]);
     for(i=1;i<r;i++)
         printf(" %d",res[i]);
       printf("
    ");
    }
    int main()
    {
        int m,x,y,n,i;
        while(~scanf("%d%d",&n,&m))
         { 
         memset(d,0,sizeof(d));
         memset(map,0,sizeof(map));
          for(i=0;i<m;i++)
          {
             scanf("%d%d",&x,&y);
             if(map[x][y])
                continue;
             map[x][y]=1;
             d[y]=d[y]++;
         }
          toposort(n);
         }
    }
     
     
  • 相关阅读:
    20165312 我期望的师生关系
    zookeeper04---ZAB协议
    zookeeper03-集群搭建
    zookeeper02
    Zookeeper01
    防止重复提交
    手动抛出异常事务回滚问题
    redis-07主从复制
    redis06-事务
    Redis-05持久化
  • 原文地址:https://www.cnblogs.com/cancangood/p/4014680.html
Copyright © 2011-2022 走看看