家谱树
时间限制:1秒 内存限制:128M
题目描述
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。 给出每个人的孩子的信息。 输出一个序列,使得每个人的后辈都比那个人后列出。
输入描述
第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
标准的拓扑排序算法,书上用栈结构我觉得没必要,用数组v记录下已经选出的点就行了。
#include<bits/stdc++.h>
using namespace std;
int n,f[101][101],d[101],v[101];
int main(){
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
int i,j,k;
cin>>n;
for(i=1;i<=n;i++){
while(cin>>k&&k!=0){
f[i][k]=1;
d[k]++;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++) {
if(v[j]==0&&d[j]==0)
break;
}
v[j]=1;
cout<<j<<' ';
for(k=1;k<=n;k++) {
if(f[j][k]==1)
d[k]--;
}
}
return 0;
}