2016-04-03 20 views
1

おはようございます。私は初心者です。私はオイラーパスの実装に取り​​組んでいます。つまり、有向グラフのすべてのエッジ(頂点ではない)は一度だけ使用する必要があります。 何らかの理由で、紙の中にあってもすべての頂点を管理することはできません。頂点の半分を無視するか、単純に頂点を回路に追加しないようです。オイラーパス、有向グラフ

期待される結果は次のとおりです。それでも

6->7->8->9->6->3->0->2->1->3->4 

、私が得る結果は次のとおりです。

my %edges={'6'=>['3','7'],'8'=>['9'],'1'=>['3'],'0'=>['2'],'3'=>['0','4'], '7' =>['8'],'9'=>['6'],'2'=>['1']}; 


    my $startvertex=6; #this i got from additional code 
    my $location=$startvertex; 
    my @stack = ($startvertex); 
    my @circuit =(); 

     while (@stack) 
     { 
      if (@{$edges{$location}}[0]) 
       { 
        push @stack, $location; 
        my [email protected]{$edges{$location}}[0]; 
        splice @{$edges{$location}},0,1; 
        $location=$newlocation; 

       } 
      else 
       { 
       push @circuit, $location; 
       $location=pop @stack; 
       } 

     } 

my @revcircuit= reverse @circuit; 
print @revcircuit; 

は非常にありがとう:

6 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 9 9 9 9 9 9 9 3 3 3 3 3 3 

は何私はコードとして持っていることは以下のとおりです。あなたの洞察のためにはるかに前もって。

+0

'{...}'はハッシュリファレンスではなくハッシュを定義しています。ここに示すようにコードを実行することはできません。 – choroba

+0

大変申し訳ございません。私はなぜそれを実行することができるのか分からない。 –

答えて

5

問題はここにある:あなたのノードの

if (@{$edges{$location}}[0]) 

一つはPerlで偽である0と呼ばれています。したがって、ゼロノードに達すると、プログラムはノードがなくなったかのように継続します。 代わりにdefinedを使用してください。また、それは、%edgesハッシュを定義するために丸括弧を使用することに注意

#!/usr/bin/perl 
use warnings; 
use strict; 

my %edges = (6 => [3, 7], 
       8 => [9], 
       1 => [3], 
       0 => [2], 
       3 => [0, 4], 
       7 => [8], 
       9 => [6], 
       2 => [1]); 

my $startvertex = 6; 

my $location = $startvertex; 
my @stack = ($startvertex); 
my @circuit; 

while (@stack) { 
    if (defined $edges{$location}[0]) { 
     push @stack, $location; 
     $location = shift @{ $edges{$location} }; 
    } else { 
     push @circuit, $location; 
     $location = pop @stack; 
    } 
} 
my @revcircuit = reverse @circuit; 
print "@revcircuit\n"; 

ここ作業バージョン、わずかに編集された(例えば、除去不要配列間接参照)です。中括弧はハッシュリファレンスを導入しています。

Reference found where even-sized list expected at ./1.pl line 5. 
+0

ああ神、ありがとう!本当にうまく動作します。私はそれを非常に高く評価します。 –

+0

どのようにポイントや何かを与えることができますか?あなたは私の割り当てを保存しました:) –

+0

@MarthaElenaIbarraあなたは答えの横にある緑色のダニをクリックすることができます(そしてupvoteも同様に) – Zaid