2016-10-01 2 views
1

これは私がグラフ内の他のノードにルートノードからのすべての最短経路を印刷することを思い付いたBFSアルゴリズムである:最大深さを有する実装BFSアルゴリズムとそのすべての最短経路を印刷

d = deque() 
d.append(root) 
level = 0 
while len(d) >= 0 and level <= max_depth: 
    u = d.popleft() 
    print(adjacency_list[u]) 
    for v in adjacency_list[u]: 
     if visited[v] == 'N': 
      if nodes2distances[u] + 1 <= nodes2distances[v]: 
       nodes2distances[v] = nodes2distances[u] + 1 
       node2parents[v].append(u) 
       d.extend(v) 
    level += 1 
    visited[u] = 'Y' 

上記のコードは、最大レベルの条件を指定しないとうまく動作しますが、このアルゴリズムを実行するたびに出力が変化します。

1)レベル制限(つまり最大レベルの指定)でこのアルゴリズムを実装する方法を説明できますか?

2)また、私が問題を解決するために取ったアプローチが改善できるかどうか教えてください。

編集: 申し訳ありませんが、私は前にそれをやっていませんでした! 私は、重み付けされていないグラフに以下のエッジがあるとします:

( 'A'、 'B')、( 'B'、 'C​​')、( 'B '、' D '、' D '、' D '、' F '、' D '、' G '、' E '、' F ' 」、 'B ' F' iのノードためのアルゴリズムを呼び出すときの深さの制限なしに私のコードを実行した後)

が、私は次の出力を得る' を、

[('A', ['B']), ('C', ['B']), ('D', ['B']), ('E', ['D']), ('F', ['D']), ('G', ['D'])] 

しかし、ときに私レベル制限2の同じ関数、つまりを呼び出します、期待される出力が間違った場所で

[('A', ['B']), ('C', ['B']), ('D', ['B']),('E',['D']),('F', ['D']),('G',['D'])] 
+0

は例(サンプル入力、予想される出力、実際の出力) – thefourtheye

+0

を提供してください、この出力が何を表すか説明してください。これはどのように最短経路ですか? –

+0

Hello Sarid!これは重み付けされていないグラフなので、最短パスはルートからノードまでのレベル数です。上の例では、私は親を印刷しているので、混乱しているように見えます。私はしばらくの間、スタックのオーバーフローが発生しましたが、質問を投稿したことはありませんでした(私は今学んでいます)。 –

答えて

1

あなたが増加しているレベルがある

[('A', ['B']), ('C', ['B']), ('D', ['B'])] 

に対し:、私は次の出力を取得します。各ノードのレベルは、その親レベルに1を加えたものに等しくなります。whileループでは、レベルをグローバルに増やすべきではありません。代わりに、キューに入れた各ノードのレベルを格納する必要があります。このような何か:

d = deque() 
      #node,level 
d.append((root,0 )) 
while len(d) >= 0: 
    front = d.popleft() 
    u = front[0] 
    level = front[1] 
    if level >= max_depth: 
     break 
    print(adjacency_list[u]) 
    for v in adjacency_list[u]: 
     if visited[v] == 'N': 
      if nodes2distances[u] + 1 <= nodes2distances[v]: 
       nodes2distances[v] = nodes2distances[u] + 1 
       node2parents[v].append(u) 
       d.append((v,level+1)) 
    visited[u] = 'Y' 
+0

お返事ありがとう!私はあなたがここで何をしようとしているのか理解していました。上記のプログラムを実行しているとき、 "level = front [0]"に達すると "d.extend(v、level + 1)"というエラーが表示されます。私はそれを "d.append(v、level + 1)"に変更しました。 max_depth = 2で動作しました。しかし、max_depth = 5で失敗したので、whileループの条件を 'len(d)> 0'に変更する必要がありました。それは今、完璧に動作します。どうもありがとうございます!!! –

+0

@ Nik.Birur私はあなたがアイデアを得たことを祈っています;) – Tempux

+0

はい!!ありがとうございました!説明をする前に、私はとても混乱しましたが、私はあなたの解決策を見た後で、 !!助けをもう一度ありがとう!!あなたは最高です!! –

関連する問題