Poj(2367),拓扑排序

题目链接:http://poj.org/problem?id=2367

题意: 知道一个数n, 然后n行,编号1到n, 每行输入几个数,该行的编号排在这几个数前面,输出一种符合要求的编号名次排序。

拓扑排序:

先找入度为0的点,再根据这个点删掉与之相连的点之间的弧,入度减一。

#include <stdio.h>

int maps[150][150];
int degree[150];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int to;
        while(scanf("%d",&to),to)
        {
            maps[i][to] = 1;
            degree[to] ++;
        }
    }

    int ans[150];
    int pos=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(degree[j]==0)
            {
                ans[pos++] = j;
                degree[j] = -1;
                for(int k=1;k<=n;k++)
                {
                    if(maps[j][k]==1)
                        degree[k] --;
                }
                break;
            }
        }
    }

    for(int i=0;i<n-1;i++)
        printf("%d ",ans[i]);
    printf("%d
",ans[n-1]);

    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5741220.html