确定比赛名次

题目

题目描述:
有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


算法

典型的拓扑排序题目,可以邻接矩阵+入度数组实现,参考链接:http://blog.csdn.net/zinss26914/article/details/8693625

AC代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX 502
 
int indegree[MAX];
int matrix[MAX][MAX];
 
/**
 * Description:邻接矩阵+入度数组实现拓扑排序
 */
void topological_sort(int n)
{
    int i, j, k;
    for (i = 0; i < n; i ++) {   // 每次循环确定一个名次
        for (j = 1; j <= n; j ++) {
            if (indegree[j] == 0) {
                indegree[j] --;
                if (i == n - 1) {
                    printf("%d\n", j);
                }else {
                    printf("%d ", j);
                }
 
                // 删除入度为0的点并且所有以它为顶点的边
                for (k = 1; k <= n; k ++) {
                    if (matrix[j][k]) {
                        matrix[j][k] = 0;
                        indegree[k] -= 1;
                    }
                }
 
                // 进行下一个循环
                break;
            }
        }
    }
}
 
int main()
{
    int n, m, u, v;
 
    while (scanf("%d %d", &n, &m) != EOF) {
        // 初始化邻接矩阵和入度数组
        memset(indegree, 0, sizeof(indegree));
        memset(matrix, 0, sizeof(matrix));
 
        // 构造入度数组和邻接矩阵
        while (m --) {
            scanf("%d %d", &u, &v);
            if (matrix[u][v] == 0) {    // 避免重复
                indegree[v] += 1;
                matrix[u][v] = 1;
            }
        }
 
        // 拓扑排序
        topological_sort(n);
    }
 
    return 0;
}
/**************************************************************
    Problem: 1449
    User: wangzhengyi
    Language: C
    Result: Accepted
    Time:30 ms
    Memory:1896 kb
****************************************************************/


posted @ 2013-04-26 14:21  java程序员填空  阅读(403)  评论(0编辑  收藏  举报