5

私は自由時間にプログラミングの問題を解決する練習をしています。私がしばらく前に見つけたこの問題は、まだそれを解決する方法がわかりません:

n個の頂点とm個のエッジ(両方とも2×10 6未満)を持つ特定の無向グラフの場合、頂点をできるだけ多くのグループに分割する必要がありますが、条件は1つです。異なるグループの頂点の各ペアはエッジで接続されています。各頂点は正確に1つのグループにあります。最後に、各グループのサイズを知る必要があります。

このソリューションを思いついたとき、私は誇りに思いました。元のグラフの補グラフを検討し、それに素集合データ構造を使用します。それは私たちに正しい答えを与えます(証明するのは難しくありません)。しかし、それは理論的な解決策にすぎません。与えられた制約があると、それは非常に悪く、最適ではありません。しかし、私はこのアプローチがどういうわけか賢く修正できると信じています。しかし、どのように?

誰か助けてもらえますか?

編集:1から7および16のエッジまでの頂点を持つグラフの場合:

1 3

1 4

1 5

2 3

3 4

4 5

4 7

4 6

5 6

6 7

2 4

2 7

2 5

3 5

3 7

1 7

サイズが1、2、4の3つのグループがあります。

これらのグループは、それぞれ{4}、{5,7}、{1,2,3,6}です。異なるグループの頂点の各ペアを接続するエッジがあり、これ以上グループを作成することはできません。

4

1 に答える 1

0

不足している唯一の要素は、スパース グラフを処理する方法だと思います。

私ができる唯一の操作がノードのセット (v_1、...、v_k など) をグループ化し、u接続されたノードにのみ新しいスーパーノード エッジを与えることである、可能な限り最大の完全なグラフを見つけるという観点からこれについて考えてみましょう。 v_1、...、v_k のすべてに。

グラフの辺が n^2/4 未満の場合は、nノードのペアをランダムにサンプリングし、どのペアが辺で結合されていないかを確認します。Union-find は、これをコーディングする簡単な方法です。このランダム サンプリングで見つけたセットをグループとして使用して、グラフを再構築します。この縮小グラフを再帰します。(このステップをどのように分析するかはよくわかりませんが、サンプルと再構築のサイクルごとにグラフのサイズが少なくとも一定の割合で縮小される可能性が高いため、このプロセス全体にほぼ線形の時間がかかると考えています。)

かなり密度の高いグラフ (少なくとも n^2/4 エッジ) ができたら、隣接行列表現に変換して、提案していたことを正確に実行できます --- すべてのノード ペアをチェックし、2 つのノードが表示されるたびに和集合を実行しますエッジで結合されておらず、セットを読み取ります。

于 2012-12-29T18:56:45.250 に答える