• hdu 1285 确定比赛名次 简单的拓扑排序


    http://acm.hdu.edu.cn/showproblem.php?pid=1285

    确定比赛名次

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
    Total Submission(s) : 51   Accepted Submission(s) : 19

    Font: Times New Roman | Verdana | Georgia

    Font Size:

    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

    杭电ACM集训队训练赛(VII)
     

      拓扑排序方法如下:

      (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.

      (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.

      (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.

    #include <stdio.h>
    #include <string.h>
    
    bool S[501][501];
    int indegree[501];
    int n,m;
    
    void  Topsort()
    {
        for(int i=1;i<=n;i++)     //每次循环输出一个名次
        {
            for(int j=1;j<=n;j++)  //从低向高遍历入度为0的点
            {
                if(!indegree[j])
                {    
                    indegree[j]--;      //置为-1 ,避免重复
                    if(i!=n)
                        printf("%d ",j);
                    else 
                        printf("%d\n",j);
                    for(int k=1;k<=n;k++)  //删除输出点以及其所有指向的边
                     if(S[j][k])
                      {
                        S[j][k]=false;
                        indegree[k]--;
                      }    
                     break;
                }    
            }
        }
    }
    
    int main()
    {
        int x,y;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
        memset(indegree,0,sizeof(indegree));
        memset(S,false,sizeof(S));
            while(m--)
            {
                scanf("%d%d",&x,&y);
                if(!S[x][y])           //避免重复,以及对边的初始化操作
                {
                    S[x][y]=true;
                    indegree[y]++;
                }
            }
            Topsort();
        }
    
        return 0;
    }

  • 相关阅读:
    人月神话阅读笔记
    12周总结
    IOS成长之路-用NSXMLParser实现XML解析
    沟通能力的表达
    IOS中UIScrollView的contentSize、contentOffset和contentInset属性
    Block 的使用时机
    drawAdapter
    drawpoly()函数的用法
    @synchronized(self)
    Swift2
  • 原文地址:https://www.cnblogs.com/hzg656343072/p/2642871.html
Copyright © 2020-2023  润新知