prim
のアルゴリズムを隣接行列グラフに実装しました。このアルゴリズムの結果は、visited
,parent
およびdistance
ベクターの3つのベクトルである。アルゴリズムvisited[i] == true
の最後には、すべてi = 0..N-1
です。 parent[i]
はi
の親であり、distance[i]
はparent[i]
からi
までの距離です。訪問先、親、距離のベクトルのみがある場合は予約注文ツリーウォーク
ここで、これらの3つのベクトルを考えて、深さ優先検索を適用できるツリー構造を作成することなく、深さ優先探索ができるかどうかを考えていました。
dfs
は、最小スパニングツリーを構築するために選択した最初のノードから開始する必要があります。このノードをノード0
にすることを選択しました。問題は、いったんこのノードにいると、すべてのノードを反復してその親をチェックしない限り、どのノードがその子であるのかわからないことです(上の3つのベクトルのみ)。その場合、ノードi
の子のセットC
が与えられた場合、私はのようにC_i
を選ぶべきです。
いつ停止する必要がありますか?ノードi
に|C| = 0
(つまり、子なしのノード)がある場合。その場合、私はi
の親に戻って、まだ訪問していない子供がいるかどうかを調べることができます。
私たちが訪問するたびに訪問したノードをマーキングするという問題もあります。私はすでに再帰されたノードを追跡する別のベクトルを単純に持つことができると思う。
また、訪問した順序のリストを保持する必要があります。これは、繰り返し実行するたびにノードをリストに追加するだけの問題です。
予約注文のツリーウォークをどのように表しますか?これは、単に私が言及したノードのリストにする必要があります。 (右?)
これは間違いありませんか?それは良いアプローチですか?あなたは他のより良いアプローチを知っていますか?
dfsを呼び出す前にノードの子を事前計算している点を除いて、これは私が説明したものではありませんか? – nbro
まあ、質問は "いつ止めるべきか"、そしてどのようにバックトラックするかなどに続き、一般的なアプローチについて尋ねることで終了しました。これが私が答えようとしていることです - 約7行の擬似コードでアルゴリズム全体を正確に記述することができます。 –
はい、ありがとう!私の質問はほぼ修辞的な質問だった、と言うことができる。 – nbro