有向グラフの2つのノード間の単純なパスの数を数えるのはどれくらい難しいですか?


29

有向グラフの2つのノード間にパスがあるかどうかを判断するための簡単な多項式アルゴリズムがあります(たとえば、深さ優先探索でルーチングラフトラバーサルを実行します)。

しかし、驚くべきことに、存在をテストする代わりにパスの数をカウントしたい場合、問題はさらに難しくなるようです。

パスが頂点を再利用できるようにする場合、sからtまでパスの数をn個のエッジで見つける動的プログラミングソリューションがあります。ただし、頂点を再利用しない単純なパスのみを許可する場合、考えられる唯一の解決策は、パスのブルートフォース列挙です。これは、指数関数的な時間の複雑さを伴います

お願いします

  • 2つの頂点間の単純なパスの数を数えるのは難しいですか?
  • もしそうなら、それは一種のNP完全ですか?(私はそれが技術的に意思決定の問題ではないという理由で言っています...)
  • そのようなハードカウントバージョンを持っているPの他の問題はありますか?**

ところで、私は実際にこの質問への答えを今知っていますが、最初に思いついたときにそれを尋ねた場合、どのような答えが得られるのか興味があります。
hugomg


@Suresh:ブルートフォース検索のコーディング方法を知っています。私の質問は、より効率的なアルゴリズムがあるかどうかです。いずれにせよ、ネタバレに興味があれば、この SOの質問はより似ており、私の答えも含まれています。
hugomg

回答:


18

カウント問題に関連する最も一般的な複雑度クラスは#Pです。特定のノードから別のノードへの単純なパスがあるかどうかを決定することは、明らかにNPにあります。それらを数えるのは#Pです。

NP完全性について:たとえそれが意思決定の問題ではない場合でも、NPにはほとんど適合しませんが存在する可能性がありますパス、そして非決定論はそれについてあなたを助けません(あなたはまだそれらをすべてチェックする必要があります)n!

最初の2つの質問に対する答えは、はい、難しいです。#P-complete(ref)です。

Wikipediaの記事には関連する事実があります。1)確率的アルゴリズムは#P完全関数を近似するのに役立ちます。これは前の記事の近似に使用されたアルゴリズムの一種です。2)ハード(#P完了)カウントバージョンには、他にも簡単な問題があります。

  • DNF式または2-SATのインスタンスを満たすすべての割り当ての検索(線形)対カウント
  • トポロジカルソートの検索(線形)とカウント
  • 発見(O(VE))対2部グラフでの完全一致のカウント

「単純なパス」という制約を削除すると、問題がPに分類されることは既にわかっています(グラフのサイズの多項式でパスの長さを制限するか、単項で制限する必要があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.