[解決済み] グラフの中で特定のノードを訪れる最短経路を求めよ
質問
約100のノードと約200のエッジを持つ無向グラフがある。 1つのノードは「開始」、1つは「終了」とラベル付けされ、「mustpass」とラベル付けされた約12のノードがあります。
私はこのグラフを通り、'start'で始まり、'end'で終わる最短経路を見つける必要がある。 で終わり、すべての 'mustpass' ノードを通過する (順序は問わない) 最短経路を見つける必要があります。
( http://3e.org/local/maize-graph.png / http://3e.org/local/maize-graph.dot.txt は問題のグラフです - これはペンシルバニア州ランカスターのトウモロコシ迷路を表しています)
どのように解決するのですか?
これを巡回セールスマン問題と比較している人は、おそらくあなたの質問をよく読んでいないでしょう。TSPの場合、目的は をすべて を訪れる最短のサイクル(ハミルトンサイクル)を見つけることです。 すべての ノードは「mustpass」とラベル付けされています。
あなたの場合、'mustpass' というラベルが付いたノードが約 12 個しかなく、12! がかなり小さい (479001600) ことを考えると、単純に 'mustpass' ノードのすべての順列を試して、'start' から 'end' までこの順序で 'mustpass' ノードを訪れる最短パスを見ることができます -- それは単に、そのリスト内のすべての連続した 2 つのノード間の最短パスの連結になるでしょう。
言い換えれば、まず各頂点のペアの間の最短距離を求めます (Dijkstra のアルゴリズムなどを使用できますが、これらの小さな数 (100 ノード) では、最も単純なコードである Floyd-Warshall アルゴリズム は時間内に実行されるでしょう)。次に、これをテーブルにまとめたら、「mustpass」ノードと残りのノードのすべての順列を試します。
このようなものです。
//Precomputation: Find all pairs shortest paths, e.g. using Floyd-Warshall
n = number of nodes
for i=1 to n: for j=1 to n: d[i][j]=INF
for k=1 to n:
for i=1 to n:
for j=1 to n:
d[i][j] = min(d[i][j], d[i][k] + d[k][j])
//That *really* gives the shortest distance between every pair of nodes! :-)
//Now try all permutations
shortest = INF
for each permutation a[1],a[2],...a[k] of the 'mustpass' nodes:
shortest = min(shortest, d['start'][a[1]]+d[a[1]][a[2]]+...+d[a[k]]['end'])
print shortest
(もちろんこれは実際のコードではありませんし、実際のパスを知りたい場合は、どの順列が最短距離を与えるか、またすべてのペアの最短パスがどうなっているかを追跡する必要がありますが、アイデアは得られます)。
これはどんな合理的な言語でもせいぜい数秒で実行されます :)
[n個のノードとk個の「mustpass」ノードがある場合、その実行時間はO(n
3
であり、100^3+(12!)(100)はよっぽどの制約がない限り、実質的に大したことはない。
関連
-
[解決済み】クイックソートとヒープソートの比較
-
[解決済み] どのようにすれば、ほとんどすべてのアルゴリズムを修正して、最良の場合の実行時間を持つようにできるか?
-
[解決済み] 定数時間や対数時間よりも、nやnlog(n)の方が良いのでしょうか?
-
[解決済み] Bogosort (a.k.a Monkey Sort)よりも悪いソートアルゴリズムはあるのか?[クローズド]
-
[解決済み] CLRSの相対的漸近成長に関する問題(表)の解き方について教えてください。
-
[解決済み] log(n!)=Θ(n-log(n))でしょうか?
-
[解決済み] 最小ボトルネックスパニングツリーと最小スパニングツリーはどう違うのですか?
-
[解決済み] スペルチェッカーで候補を出すアルゴリズムとは?
-
[解決済み] クイックソートとマージソートの比較 [重複]。
-
[解決済み] ハングマンの難易度を「易しい」「中くらい」「難しい」に分類するためのアルゴリズム
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】決定木(比較ソートアルゴリズム)の葉の最短の深さ)
-
[解決済み] 解いてみてください。T(n) = T(n-1) + n [重複] とする。
-
[解決済み] 再帰性 T(n) = T(n^(1/2)) + 1
-
[解決済み] 線形時間でのソート?[クローズド]
-
[解決済み] 整数の絶対値の計算方法
-
[解決済み] 与えられた数列の中に現れない最小の正の整数を求めよ。
-
[解決済み] ブルームフィルターを使用するメリットは何ですか?
-
[解決済み] 検索語句の上位10位を見つけるアルゴリズム
-
[解決済み] 浮動小数点数を読みやすい分数に変換するには?
-
[解決済み] 2つの画像の類似度を測るには?[クローズド]