【题目描述】有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。 给出每个人的孩子的信息。 输出一个序列,使得每个人的后辈都比那个人后列出。 【输入】第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;
}