11 my ($v, $f, $n) = /Valve (..) has flow rate=(\d+);.* to valves? (.*)/;
13 $tun{$v} = [ split /, /, $n ];
18 my @q = [ $start, 0 ];
21 my ($node, $len, @path) = @$st;
23 $seen{$node} = [ $len, @path ];
25 for my $neigh (@{ $tun{$node} }) {
26 push @q, [ $neigh, $len+1, @path, $node ];
33 for my $node ('AA', keys %flow) {
34 $paths{$node} = bfs($node);
38 my @q = [ 'AA', 26, 0, { map { $_ => 1 } @nodes }, [ ] ];
43 my ($node, $mins, $total, $opened, $path) = @$st;
46 # say "At $node $mins $total ", join(',', @$path);
50 for my $n1 (keys %{ $paths{$node} }) {
52 my $dist = $paths{$node}{$n1}[0];
53 next if $opened->{$n1};
55 my $m1 = $mins - $dist - 1;
57 my %o1 = (%$opened, $n1 => 1);
58 # say " opening $n1 at $m1 ", $flow{$n1}*($m1);
59 push @q, [ $n1, $m1, $total + $flow{$n1}*($m1),
60 \%o1, [ @$path, $n1 ] ];
66 my @nodes = sort keys %flow;
70 sub walk1($n1, $n2, $rest) {
72 my $sum = walk(@$n1) + walk(@$n2);
74 if (!defined $mx || $mx < $sum) {
75 say join(' ', @$n1), ' | ', join(' ', @$n2), " ($walked) = $sum";
81 my $node = shift @nrest;
82 walk1([ @$n1, $node ], $n2, \@nrest);
83 walk1($n1, [ @$n2, $node ], \@nrest);
86 my $first = shift @nodes;
87 walk1([$first], [], \@nodes);