zoukankan      html  css  js  c++  java
  • 杭电 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): 11664    Accepted Submission(s): 4644

    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
    拓扑排序模板题:
     AC代码:
    #include<stdio.h>  
    #include<iostream>  
    using namespace std;  
    int map[505][505],pre[505];  
    int c[505];  
    int n,m;  
    void topsort()  
    {  
        int i,j,k,p=1;  
        for(i=1;i<=n;i++)  
        {  
            for(j=1;j<=n;j++)  
            {  
                if(pre[j]==0)     // 假设该顶点入度为0  
                {  
                    pre[j]--;     //删除该顶点,即该顶点入度减一  
                    c[p++]=j;     //删除元素储存到c[]数组中  
                    for(k=1;k<=n;k++)   
                    {  
                        if(map[j][k]==1)  //推断该顶点j与哪些点相连  
                            pre[k]--;     //若相连。则删除该边,即把与顶点j相连那点的入度减一  
                    }  
                    break;  
                }  
            }  
        }  
    }  
      
    int main ()  
    {  
        int a,b,i;  
        while(~scanf("%d%d",&n,&m))  
        {  
            memset(pre,0,sizeof(pre));  
            memset(map,0,sizeof(map));  
            for(i=0;i<m;i++)  
            {  
                scanf("%d%d",&a,&b);  
                if(map[a][b]==0)    // 要考虑重边情况  
                {  
                  map[a][b]=1;  
                  pre[b]++;  
                }  
            }  
      
            topsort();  
            for(i=1;i<=n;i++)  
            {  
                if(i!=n)  
                    printf("%d ",c[i]);  
                else  
                    printf("%d
    ",c[i]);  
            }  
        }  
        return 0;  
    }




  • 相关阅读:
    Unique Binary Search Trees——LeetCode
    Binary Tree Inorder Traversal ——LeetCode
    Maximum Product Subarray——LeetCode
    Remove Linked List Elements——LeetCode
    Maximum Subarray——LeetCode
    Validate Binary Search Tree——LeetCode
    Swap Nodes in Pairs——LeetCode
    Find Minimum in Rotated Sorted Array——LeetCode
    Linked List Cycle——LeetCode
    VR AR MR
  • 原文地址:https://www.cnblogs.com/llguanli/p/8686226.html
Copyright © 2011-2022 走看看