zoukankan      html  css  js  c++  java
  • 题目1449:确定比赛名次

    题目1449:确定比赛名次

    时间限制:1 秒

    内存限制:128 兆

    特殊判题:

    题目描述:

    有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。

    输入:

    输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。

    输出:

    给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

    其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。

    样例输入:
    4 3
    1 2
    2 3
    4 3
    样例输出:
    1 2 4 3

    拓扑排序,这样的报告也发出来了,我真的是有点无聊了。
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <queue>
    #include <stdio.h>
    #include <string.h>
    #include <vector>
    #include <queue>
    #include <set>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <math.h>
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    typedef long long LL ;
    const int Max_N =508 ;
    class TopOrder{
      public :
         int N ;
         int M ;
         vector<int>grid[Max_N] ;
         int in_degree[Max_N] ;
         vector<int>order ;
         TopOrder(){} ;
         TopOrder(int ,int) ;
         void read() ;
         void out() ;
         vector<int> TopSort() ;
    };
    
    TopOrder::TopOrder(int n,int m):N(n),M(m){
        for(int i = 1 ;i <= N ;i++){
            in_degree[i] = 0 ;
            grid[i].clear() ;
        }
    }
    
    void TopOrder::read(){
        int u ,v ;
        while(M--){
            scanf("%d%d",&u,&v) ;
            grid[u].push_back(v) ;
            in_degree[v]++ ;
        }
    }
    
    vector<int> TopOrder::TopSort(){
        vector<int> ans ;
        ans.clear() ;
        priority_queue< int , vector<int> ,greater<int> >que ;
        for(int i = 1 ;i <= N ;i++){
            if(in_degree[i] == 0)
               que.push(i) ;
        }
        while(!que.empty()){
            int u = que.top() ;
            que.pop() ;
            ans.push_back(u) ;
            for(int i = 0 ;i < grid[u].size() ;i++){
                int v = grid[u][i] ;
                if(--in_degree[v] == 0)
                    que.push(v) ;
            }
        }
        return ans ;
    }
    
    void TopOrder::out(){
        order = this->TopSort() ;
        printf("%d",order[0]) ;
        for(int i = 1 ;i < order.size();i++)
            printf(" %d",order[i]) ;
        puts("") ;
    }
    
    int main(){
      int n , m ;
      while(cin>>n>>m){
            TopOrder app(n,m) ;
            app.read() ;
            app.out() ;
      }
      return 0 ;
    }
  • 相关阅读:
    在scrapy的spiders文件中设置请求时间间隔
    Python中map和reduce函数
    正则表达式
    eslint下的rules一些规则(转:备用)
    谷歌云设置xshell登录
    (过期)活动赠送的国外云服务器VPS【速度极慢,适合小白练手】
    关于服务器的那些事~~~
    call()和appy()的区别及常用场景
    javascript中使用this关键字的大总结
    懵懵懂懂、迷迷糊糊
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3431976.html
Copyright © 2011-2022 走看看