-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclassmates2.pl
117 lines (84 loc) · 1.99 KB
/
classmates2.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
use strict;
use warnings;
use Data::Dumper;
=head2
10
2 3 0
4 5 7 0
6 9 0
0
0
8 10 0
0
0
0
0
2
=cut
my @table;
my $n = (<>);
my $i = 0;
my %managers;
my $nc = $n;
while($nc--) {
$_ = (<>);
chomp;
my @subordinates = grep {$_ != 0} ( split(/\s+/, $_));
foreach my $s (@subordinates) {
$managers{$s-1} = $i;
$table[$i][$s-1]=1;
}
$i++;
}
=head timeInRoot
Находим время обсчет дерева начиная с корня X.
Время обхода этого дерева это
max( i + timeInRoot(k) для всех подчиненых X отсортированных по увеличинию продолжительности обсчета в них. )
(1+6) (2+5) (3+4) (4+3)
"Таня" разбивает дерево на две части - подчиненные кати и ее начальник. считаем начальника как подчиненного
=cut
my $tanya = <>;
$tanya--;
print_table(\@table);
change_root($tanya);
print "\n";
print_table(\@table);
print calc($tanya),"!!!";
use List::Util qw/max/;
sub calc
{
my ($root) = @_;
my $offt = 1;
warn "calc($root)\n";
if (!defined $table[$root]) {
return 0;
}
my @subordinates = map { $_ + ($offt++) }
sort { $b <=> $a }
map { calc($_) }
grep { ($table[$root][$_] // 0) != 0 }
(0 .. (scalar (@{$table[$root]}) -1));
if (!@subordinates) {
return 0;
}
return max(@subordinates);
}
sub change_root
{
my ($from) = @_;
if (exists $managers{$from}) {
$table[ $managers{$from} ][ $from ] = 0;
$table[$from][ $managers{$from} ] = 1;
change_root($managers{$from});
}
}
sub print_table
{
my ($result) = @_;
for (my $i = 0; $i < @table; $i++) {
for (my $j = 0; $j < $n; $j++) {
print $table[$i][$j] // 0, " ";
}
print "\n";
}
}