いくつかのノード間の有向グラフで指定された長さ未満のすべてのパス


8

有向グラフまたは無向グラフ内のいくつかのノード間のすべての可能なパス、または指定された長さのすべての可能なパスをカウントすることは、古典的な問題です。可能性のサイクルにより、すべての意味に注意を払う必要があります。

この質問は少し異なる、または少なくとも私は思います。

INPUT: してG有向グラフ。Gは、サイクルと自己接続ノードを持つことができます。してみましょうA(G)はの隣接行列もG(中1とG I、J Iからjに行くリンクとそうでない場合は0があります場合)。Gのノードの2つのサブセットであるTBを定義します。

結果:Tの 1つのノードからBの 1 つのノードに向かう、最大で k のすべてのパスのリスト。パスは、ソースノードからターゲットノードに厳密にk + 1ステップ未満で進む限り、同じエッジを複数回含むことができます。

質問:このタスクで最適なアルゴリズムを知りたいのですが。隣接行列のn乗がシンボリックに計算された場合(1の代わりに各エントリに異なる変数を使用)、このすべてのパス(およびエントリに1を使用して数値で計算された場合、パスのカウントに減少します)。しかし、これがタスクを実行する最も速い方法であるかどうかは本当にわかりません(おそらくそうではありません)。

警告:私はカウントの問題や最短のパスを求めているのではありません。パスの長さは、使用されるエッジの数として定義されています(繰り返しをカウントしています)。私はRを使用していますが、他の言語で考えたい場合は、質問がすでに提起され、解決されていたら本当に申し訳ありません。親切に助けてくれてありがとう!

追加情報:行列べき級数アプローチ(A ^ 3は3つの長いパスをすべて提供します...)とdfs / bfsを試しました。後者の2つは、ソースとターゲットのセットで作業していることを考慮に入れておらず、したがって多くの冗長な作業を行うため、最適性には程遠いと思います...


こんにちは!Rで記号的に行列を乗算することにまだ興味がありますか?
Ferdinand.kraft

うん、それは象徴的にはより文字列のようですが(stackoverflowの質問を参照してください)。ありがとう。
gvdr

次に、Stackoverflowで私の回答を参照してください。
Ferdinand.kraft

回答:


7

あなたの質問について私が見逃していない場合は、単一のソースと単一の宛先の場合に、複数のソースと宛先に関する質問を減らすための標準的なトリックを適用できます。

  1. 2つの新しいノードを追加する s そして t
  2. 接続する s すべてのソースに、
  3. すべての目的地を t

この削減の後、2つの追加の頂点を持つ標準的な質問の設定になります。 s そして t そして、私たちはからの散歩を見つけたいです st せいぜい長さ k+2


どうしてトリックが見えなかったのですか?それは仕事をするだけです、それの後でそれはすべて非常に簡単に思えます。
gvdr

1
また、元の隣接行列で直接行列の電力供給アプローチを使用することもできます。 (Ak)ij 長さのパスの数です k から j
Yuval Filmus

@YuvalFilmus、私はパスを数えていませんが、実際にそれらを見つけています。したがって、単純に行列のパワーを使用することはできませんが、その「文字列」バージョンを使用します。
gvdr 2013

2
@ユヴァルFilmus:ユヴァルは正しいです!彼が「パスの数」に言及するとき、これはそれらを数える問題を解決するためではなく、前の隣接行列でどのインデックスを見るかを知るためだけに理解されるべきですk1。もしkj=1 次に、すべてのノードを調べて、dfsまたはbfsを逆方向に検索します k1ω=1 もしそうなら k1ωjまた、1に等しい
カルロスリナレスロペス

申し訳ありませんがカルロス、私はあなたの答えを逃しました。
gvdr 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.