Я не часто использую графики, но этот код (использующий модуль Graph
), похоже, выполняет свою работу:
use Graph;
use strict;
my $graph = Graph->new;
while (<DATA>) {
my ($dir, $x, $y) = split;
if ($dir eq 'Downgrade') {
($x, $y) = ($y, $x);
} elsif ($dir ne 'Upgrade') {
die qq(Unknown direction "$dir"\n);
}
$graph->add_edge($x, $y);
}
$graph->is_dag
or die "Graph has a cycle--unable to analyze\n";
$graph->is_weakly_connected
or die "Graph is not weakly connected--unable to analyze\n";
print join(' < ', $graph->topological_sort), "\n";
__DATA__
Upgrade Add Buy
Downgrade Add Hold
Upgrade Hold Add
Downgrade Buy Outperform
Upgrade Hold Outperform
Downgrade Hold Reduce
Upgrade Add Outperform
Это печатает Reduce < Hold < Add < Outperform < Buy
.