(Perl)ファイルから隣接リストを読み込んでハッシュを作成したいのですが、ソースに記した場合との違いに気づけないでいます。
解決したいこと
セットされた環境がありましたので、試したい計算によくPerlを使っています。
広井誠 (Makoto Hiroi) 様のHP
「経路の探索」
http://www.nct9.ne.jp/m_hiroi/linux/perl10.html
で公開されているサンプルを元に、以下のソースファイルを作成しました。
公開されているサンプルでは、隣接リストをソースの中で
%adjacent = (
A => ['B', 'C'],
B => ['A', 'C', 'D'],
C => ['A', 'B', 'E'],
D => ['B', 'E', 'F'],
E => ['C', 'D', 'G'],
F => ['D'],
G => ['E']
);
としてあります。これをファイル「adjacent.txt」から読み込むものにしたいのですが、エラーこそせないものの出力がありません。
随所で変数をprintしてみるのですが、%adjacent をソースに書き込んだ場合とファイルから読み込んだ場合との差異に気づけないでいます。お気づきの点をご指摘いただけましたら幸いです。
発生している問題・エラー
(出力なし)
該当するソースコード
# dfs.pl : 経路の探索 (深さ優先探索)
#
# Copyright (C) 2015 Makoto Hiroi
#
use strict;
use warnings;
use Encode qw/encode decode/;
# 隣接リスト
my %adjacent = ();
my $filename = "adjacent.txt";
open(IN, "$filename") or die "Can't open `$filename': $!";
while(my $line = <IN>){
decode('utf-8', $line);
chomp ($line);
my @arr = split("\t", $line);
my $key = shift(@arr);
if (exists($adjacent{$key})){
;
}
else{
@{$adjacent{$key}} = ();
}
my @array = @{$adjacent{$key}};
push(@array, $arr[0]);
$adjacent{$key} = \@array;
}
close (IN);
# 実行
dfs('G', ['A']);
# 配列に同じ要素があるか
sub member {
my ($n, $xs) = @_;
foreach my $x (@$xs) {
return 1 if $x eq $n;
}
0;
}
# 深さ優先探索
sub dfs {
my ($goal, $path) = @_;
my $x = $path->[-1];
if ($goal eq $x) {
print "@$path\n";
} else {
my $ls = $adjacent{$x};
foreach my $y (@$ls) {
if (!member($y, $path)) {
push @$path, $y;
dfs($goal, $path);
pop @$path;
}
}
}
}
「adjacent.txt」
A B
A C
B A
B C
B D
C A
C B
C E
D B
D E
D F
E C
E D
E G
F D
G E
望まれる出力結果
A B C E G
A B D E G
A C B D E G
A C E G