zoukankan      html  css  js  c++  java
  • HDU 1285 确定比赛名次(第一个拓扑排序题目)

    有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
     

     

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #define N 503
    using namespace
    std;
    int
    pre[N];
    int
    main()
    {

       // freopen("in.txt","r",stdin);
      int n,i,m,x,y;
      bool
    p[N][N];
      while
    (scanf("%d%d",&n,&m)!=EOF)
      {

         memset(pre,0,sizeof(pre));
         memset(p,0,sizeof(p));
         for
    (i=1;i<=m;i++)
           {

               scanf("%d%d",&x,&y);
            if
    (x!=y&&!p[x][y])//这里的x!=y可以去掉(快15Ms),这题有重边,却不考虑自己到自己的情况。
               {
    p[x][y]=1;
                pre[y]++;}
           }

        x=n-1;
        while
    (x--)
        {

            for
    (i=1;i<=n;i++)
              if
    (pre[i]==0)
                  break
    ;
            for
    (y=1;y<=n;y++)
               if
    (p[i][y])
                  pre[y]--;
            pre[i]=-1;
            printf("%d ",i);
        }

        for
    (i=1;i<=n;i++)
        if
    (pre[i]==0)
         {

             printf("%d\n",i);
             break
    ;
         }
      }

        return
    0;
    }


  • 相关阅读:
    markdown常用语法
    利用 js-xlsx 实现选择 Excel 文件在页面显示
    HTML中meta标签
    wxpy模块
    Python基础(3)
    Python基础(2)
    Python基础(1)
    Python之递归锁与互斥锁
    Python进程与线程
    Docker
  • 原文地址:https://www.cnblogs.com/372465774y/p/2457507.html
Copyright © 2011-2022 走看看