确定比赛名次(最基本的拓扑排序)

有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

方法就是拓扑排序设置一个邻接矩阵(2维数组),加一个入度数组,然后将入度为0的点的边删掉,根据顺序输出。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int MX=1e3+100;
int deg[MX],Map[MX][MX];
int main()
{
    int n,m;
    while (~scanf ("%d %d",&n,&m)){
        memset(deg,0,sizeof(deg));
        memset(Map,0,sizeof (Map));
        for (int i=0;i<m;i++){
            int u,v;
            scanf ("%d %d",&u,&v);
            if (!Map[u][v]){
                Map[u][v]=1;
                deg[v]++;
            }
        }
        for (int i=1;i<=n;i++){                 //拓扑排序
            for (int j=1;j<=n;j++){
                if (!deg[j]){
                    deg[j]--;
                    if (i!=n) printf ("%d ",j); //因为是从1到n,所以输出的一定是按照字典序输出的
                    else printf ("%d\n",j);
                    for (int k=1;k<=n;k++){
                        if (Map[j][k]){
                            deg[k]--;
                        }
                    }
                    break;
                }
            }
        }
    }
    return 0;
}
时间: 2024-10-28 08:14:25

确定比赛名次(最基本的拓扑排序)的相关文章

确定比赛名次 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队. Ou

hdu 1285 确定比赛名次(给一个拓扑有序图要求输出拓扑有序序列)

1.如果有向图无回路,那么该图拓扑有序. 2代码: #include<cstdio> #include<cstring> using namespace std; int mat[505][505]; int n,m; int in[505]; void topological_sort() { int cnt=n; while(cnt--) { int i; for(i=1; i<=n; i++) { if(in[i]==0) break; } printf("%

拓扑排序——CodeForces-645D

题目链接 题目含义 有一个机器人比赛,只要a能打败b,b能打败c,a就一定能打败c 然后给出一堆比赛的结果,如果不能得到唯一的所有的机器人战力排名,就输出-1 如果可以的话,最少能用前几场比赛结果能得到,输出这个最少的比赛次数 题目分析 使用拓扑排序,如果出队数不等于机器人数或者某一时刻队列有两个及以上入度为零的点时都输出-1 而如果满足的话,要找到最少的比赛次数 如果加一条边用一次拓扑排序的话,明显会超时 这里提供两种方法 (1)你有发现拓扑排序每两个点的关系都有在题中给出吗 比如说4-2-1

hdu1285 确定比赛名次 (拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16782    Accepted Submission(s): 6659 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

HDU1285 确定比赛名次【拓扑排序】【优先队列】

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13215    Accepted Submission(s): 5291 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

[ACM] hdu 1285 确定比赛名次 (拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10358    Accepted Submission(s): 4046 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

HDU[1285]确定比赛名次 拓扑排序

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意:某人知道N个队伍M场比赛的胜负结果,要求输出N个队伍的名次(id为第二关键字). 核心思想:转化为图论问题,进行拓扑排序.步骤1.选定入度为0的点 2.删除该点与关联边 3.重复该过程 代码如下: //拓扑排序 (1.选入度为0的点.2.删除该点及关联边 3.重复该过程) #include <iostream> #include <memory.h> using nam

HDOJ 1285 确定比赛名次(拓扑排序,四种实现方法)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17294    Accepted Submission(s): 6888 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

HDU 1285-确定比赛名次(拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12678    Accepted Submission(s): 5095 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直