7690: 家谱树 拓扑排序

发布时间 2023-04-28 16:53:16作者: CRt0729

描述

 

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。

给出每个人的孩子的信息。

输出一个序列,使得每个人的后辈都比那个人后列出。

 

输入

 

第1行一个整数N(1≤N≤100),表示家族的人数;

接下来N行,第i行描述第i个人的儿子;

每行最后是0表示描述完毕。

 

 

输出

 

输出一个序列,使得每个人的后辈都比那个人后列出;

如果有多解输出任意一解。

 

 

样例输入

 

5
0
4 5 1 0
1 0
5 3 0
3 0

样例输出

 2 4 5 3 1

题目来源

#include<bits/stdc++.h>
using namespace std;
int vis[101][101];
int r[101]; //入度 ,被指向的顶点数量 
int c[101]; //出度,指向的顶点数量 
stack<int>v;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x;
        while(cin>>x,x)
        {
            c[i]++; //i的出度+1
            vis[i][c[i]] = x; //存储和i相连的结点x
            r[x]++; //结点x的入度+1 
        }
    }
    for(int i=1;i<=n;i++)
        if(r[i]==0)
            v.push(i); //入度为0,入栈
    int num = 0;
    do
    {
        int temp = v.top();v.pop();
        num++;
        cout<<temp<<" ";
        for(int i=1;i<=c[temp];i++) //遍历和栈顶相连的点c[temp]
        {
            r[vis[temp][i]]--; //其他点的入度-1
            if(r[vis[temp][i]]==0)
                v.push(vis[temp][i]); 
        } 
    }while(num!=n); 
     return 0;
}