問題を効率的に(高速に)答えることができる何らかの前処理を実行できますか?無向グラフの3つの頂点が最も効率的な方法でサイクルに属していることを確認してください
グラフは、無向で接続されていますが、自己ループがない並列エッジ(サイクルは少なくとも3ノードで形成されます)です。
これはyes/noクエリーで、このようなサイクルが終了するかどうかを知る必要があることを意味します。
編集:
Iは、関節点をサブコンポーネントにグラフを分離し、次にそれぞれに関節点を倍増していた:My進展これまで、私はブロッキングだ(ヌルスルタンヒントに基づいて)それらがもともと分離したサブコンポーネントである。これは、次のような観察から得られたものです.3つの頂点は、サイクルに属している可能性があります。iffこれらはすべてアーティキュレーションポイントのないコンポーネントに属します。私はこれを証明していないが、反例を考えることができなかった。
上記の所見が正しいと仮定すると、問題は今や問合せの3つの頂点がすべて関節点になる可能性があります。その場合、それらのすべてが複数のコンポーネントに属します。 O(n)クエリ時間の複雑さが遅くなる可能性があります。
説明されている最悪の場合に対処するのに役立つもう1つの観察は、2つの所与の関節点が両方とも同時に属している(私は必要であればこれを証明することができる) O(n^2)の前処理時間が非常に遅い(O(n^2))場合は、最悪の場合の前処理空間とO(n^2)(nは頂点の数)スペースもあまりにも貪欲です)。前処理を改善できますか? log(n)クエリ時間の費用のトレードオフは問題ありません。
ノードの0、1、3はすべて同じサブグラフにありますが、サイクルに属していません(常に1にする必要があります)。 0から3までループするために2回訪れた)。 – ALTN
@ALTNが述べたように、これは正しい解決策ではありません。そのため、各サブグラフをアーティキュレーションポイントで分割し、それらを倍増する必要があります。 http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ –
正しいように見える、ありがとう! :) – ALTN