家谱树(gentree)
【题目描述】
有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输入一个序列,使得每个人的后辈都比那个人后列出。
【输入】
第一行一个整数(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
思路
裸题拓补排序
1 program gentree; 2 var 3 ok,n,i,now,top,pin,apple,j:longint; 4 ru,chu:array[0..100] of longint; 5 vis:array[1..100] of boolean; 6 a:array[1..100,1..100] of longint; 7 8 procedure init; 9 begin 10 readln(n); 11 for i:= 1 to n do 12 begin 13 repeat 14 inc(chu[i]); 15 read(a[i,chu[i]]); 16 inc(ru[a[i,chu[i]]]); 17 until a[i,chu[i]]=0; 18 dec(chu[i]); 19 end; 20 end; 21 { 22 procedure addstack; 23 begin 24 for i:= 1 to n do 25 if ru[i]=0 then 26 begin 27 inc(top); 28 stack[top]:=i; 29 end; 30 end; } 31 32 procedure db(apple:longint); 33 begin 34 35 for j:= 1 to chu[apple] do 36 dec(ru[a[apple,j]]); 37 38 end; 39 40 procedure topo; 41 begin 42 43 repeat 44 for i:= 1 to n do 45 if (ru[i]=0) and (not(vis[i])) then 46 begin 47 write(i,' '); 48 db(i); 49 inc(ok); 50 vis[i]:=true; 51 end; 52 until ok=n; 53 54 end; 55 56 begin 57 assign(input,'gentree.in'); 58 assign(output,'gentree.out'); 59 reset(input); 60 rewrite(output); 61 62 init; 63 topo; 64 65 close(input); 66 close(output); 67 end.