题目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 ;
}

 

你可能感兴趣的:(题目1449:确定比赛名次)