1351:家谱树

 

【题目描述】

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

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

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

【输入】

第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>
#define rush() int T;cin>>T;while(T--)
#define sf(a) scanf("%d\n",&a)
#define go(a) while(scanf("%d",&a)!=EOF)
#define ms(a,b) memset(a,b,sizeof a)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pf(a) printf("%.6lf",a)
#define E 1e-8
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int idata=1500+5;

int i,j,k;
int _,n,m,t,cnt;
ll minn,maxx;
vector<int> v[idata];
queue<int> q;
int into[idata];//入度

void topsort()
{
    for(int i=1;i<=n;i++){
        if(!into[i]) q.push(i);
    }
    while(!q.empty()){
        int head=q.front();q.pop();
        cout<<head<<" ";
        for(int i=0;i<v[head].size();i++){
            if(--into[v[head][i]]==0)
                q.push(v[head][i]);
        }
    }
}
int main()
{
    /*cin.tie(0);
    iostream::sync_with_stdio(false);*/
    go(n)
    {
        for(i=1;i<=n;i++)
        {
            while(cin>>j,j){
                v[i].push_back(j);
                into[j]++;//
            }
        }
        topsort();
        break;
    }
    return 0;
}
原创文章 410 获赞 16 访问量 3万+

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/105810581