use strict;
use warnings;
use Data::Dumper;

my $data = {
    1 => [5],
    2 => [2, 3, 4, 7, 8],
    3 => [1, 3, 4, 7, 9],
    4 => [1, 2, 4, 8],
    5 => [1, 6, 7, 9],
    6 => [1, 5, 8],
    8 => [3, 4],
    9 => [1, 4, 6, 8]
};
my $cnt = keys %{ $data };
my $p = {};
my $t = {};

my @keys = keys %{ $data };

for (@keys) {
    $p->{$_} = 1 / $cnt;
    $t->{$_} = 0;
}
for (0..$cnt - 1) {
    for (@keys) {
        my $graphs = $data->{$_};
        my $graphs_count = @{ $graphs };

        for my $graph (@{ $graphs }) {
            $t->{$graph} += $p->{$_} / $graphs_count;
        }
    }

    my $sum = 0;

    for (@keys) {
        $p->{$_} = (0.15 / $cnt) + 0.85 * $t->{$_};
        $t->{$_} = 0;
        $sum += $p->{$_};
    }
    for (sort keys %{ $p }) {
        $p->{$_} /= $sum;
    }
}

print Dumper $p;