この問題は、グラフ内のアーティキュレーション ノードを見つける問題と非常に似ているようです。アーティキュレーション ポイントまたは二重接続コンポーネントの技術的な定義は、ノードを削除するとグラフが 2 つに分割されるノードです。
グラフからの連結ノードの発見は、大部分が解決された問題であり、詳細については、http: //en.wikipedia.org/wiki/Biconnected_componentを参照してください。
一般的に、このような問題にアプローチする方法は、次のようなものになるようです。
1. Find all articulation points
2. Do a bfs from each node and determine articulation points along the path
3. Split graph at the articulation point, choosing the side with minimal edges
4. Continue until the two nodes are not connected
上記の例では、7 が唯一の関節点であり、7 と 0-4 グラフの間には 2 つのエッジしかなく、7 と 5,6,8 の間には 3 つのエッジしかないため、7、2、および 3 の間のエッジを切り取ります。グラフ。
これを行うためのより確立されたアルゴリズムがあります(読んでください:私が思いつきませんでした)、n ^ 2時間で問題を解決できるKargerのアルゴリズムと呼ばれます。
このアルゴリズムは、ノードが 2 つになるまで隣接するノードを効果的に結合し、2 つのノード間に残っているエッジの数をカウントすることによって機能します。エッジの数は、グラフを分割するために必要なカットの最小数です。
問題に Karger のアルゴリズムを実装する方法には、分割する 2 つのノードに常にノードを結合する必要があるという警告が必要です。さらに、カットする必要がある元のエッジに戻ることができるようにするには、エッジが最初に属していたノードへの参照を保持する必要があります。
Karger のアルゴリズムの優れた視覚化がここにあります: http://en.wikipedia.org/wiki/Karger%27s_algorithm