家谱树(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.

 

posted @ 2017-02-17 18:32  bobble  阅读(2514)  评论(0编辑  收藏  举报