ノードの有向非循環グラフが与えられた場合、ノードの次のnペア(1 → n + 1 )、… 、(n → n + n )の間にパスがあるかどうかをどのように判断できますか?そこに簡単なアルゴリズムであり、O (nが⋅ (N + M ))各ノードからの検索実行することによって(mはエッジの数である)1 ... N、それはより良好に行うことができますか?
編集:完全なパスではなく、存在を探しています。
ノードの有向非循環グラフが与えられた場合、ノードの次のnペア(1 → n + 1 )、… 、(n → n + n )の間にパスがあるかどうかをどのように判断できますか?そこに簡単なアルゴリズムであり、O (nが⋅ (N + M ))各ノードからの検索実行することによって(mはエッジの数である)1 ... N、それはより良好に行うことができますか?
編集:完全なパスではなく、存在を探しています。
回答:
チャンドラChekuriコメントで指摘したように、あなただけのO(問題解決、高速な行列の乗算を経由して推移閉包を計算することができ)の時間を(お好みの方法で、O(使用nは2.376の銅細工とウィノグラード、以上の事実上経由) StrassenのO(n 2.81))を使用します。これは、密なグラフに適しています。
密なグラフの問題でこの実行時間を上回れば、2つのブール行列の積を計算するよりも効率的な三角形検出のアルゴリズムが得られると私は主張します。このようなアルゴリズムの存在は、未解決の大きな問題です。
三角形の問題をnペアのDAG到達可能性の問題に還元します。n個のノードにグラフGが与えられ、Gに三角形が含まれているかどうかを判断するとします。
及び dは、従って得ダミー)を、 6 N正確に問題の-nodeインスタンス。
トポロジカルソート()を実行して、各ノードに到達できるノードのビットセット(O (m n ))を伝播します。
yespath = array(1..N) // output of the algorithm
// initially filled with false
processed = array(1..N) // processed nodes
// HEURISTIC 1: some preprocessing
for every node u in 1..N
if (no outbound edges from u) then processed[u] = true
if (no inbound edges to u+N) then processed[u] = true
for each node u in [1..N] // MAIN loop
if (not processed[u]) then
collected = [u] // a list that initially contains u
visited = array(1..2*N) // filled with zeroes
do a breadth first scan from u
for each node v found in the search
set visited[v] = distance from u
if (v <= N) then add v to collected
end do
// HEURISTIC 2: useful collected info on other nodes <= N
foreach node v in collected
processed[v] = true
if ( visited[ v + N ] > 0 and visited[v] < visited[v+N] ) then yespath[v] = true
end foreach
end if
end for // MAIN loop
他のヒューリスティックを追加できますが、それらの効率(および提案された3つの効率)はグラフ構造に大きく依存します。