CPANのGraphがいい感じだった

経路探索のTDDBC問題をGraph使って解く。

Graph::Undirectedオブジェクトにadd_weighted_edge()でノード登録と重み付けして、SP_Dijkstra('tabata', 'omiya')でダイクストラ砲の最短経路を求めたりできる感じ。

一部抜粋こーど

use strict;
use warnings;
use Graph::Undirected;
use Text::CSV_XS;

sub new {
    my( $class, %options ) = @_;
    my $self = bless {
        time_graph => {},
        distance_graph => {},
    }, $class;

    die 'ERROR: routemap required' unless defined $options{routemap};
    $self->_build_graph( $options{routemap} );

    return $self;
}

sub _build_graph {
    my( $self, $routemap_path ) = @_;

    my $time_graph = Graph::Undirected->new;
    my $distance_graph = Graph::Undirected->new;
    my $csv = Text::CSV_XS->new();

    open( my $fp, '<', $routemap_path ) or die 'ERROR: cannot open routemap';
    while( my $line = <$fp> ) {
        chomp $line;
        $csv->parse($line) or die 'ERROR: cannot parse';
        my @field = $csv->fields();
        $time_graph->add_weighted_edge( $field[0], $field[1], $field[2] ); # 時間$field[2]で重み付け
        $distance_graph->add_weighted_edge( $field[0], $field[1], $field[3] ); # 距離$field[3]で重み付け
    }

    $self->{time_graph}     = $time_graph;
    $self->{distance_graph} = $distance_graph;
}

newするときに

yokohama,musashikosugi,23,13.4
yokohama,kawasaki,14,10.6
musashikosugi,nishikokubunji,50,24.3

みたいなedgeのCSVファイルを読ませて実行する。