私にグラフのクリークを与えるブラックボックス(/アルゴリズム)があるとしましょう。そこからクリークカバーを見つける方法はありますか?
私が見つけようとしている直感的なアイデアが写真に示されています。ブラックボックスの部分を探しています。さらに説明が必要な場合は、お気軽にお問い合わせください。クリークのエッジを削除してグラフを更新するアイデアがあります。うまくいくかはわかりません。他にもアイデアお待ちしております。
http://mathworld.wolfram.com/CliqueCoveringNumber.html
新しいグラフには、カバーを解決するために使用されるクリークが欠落している可能性があるため、エッジを削除しても役に立ちません。
B
/ | \
A | D
\ | /
C
ABC から始めて、そのエッジ AB AC と BC を削除すると、アルゴリズムは BCD クリークを見つけることができなくなります。
クリーク カバー数を計算する前に、グラフのすべての最大クリークが必要になります。
AllCliques = GetAllCliques()
MaximalCliques = AllCliques
For Each ckA in MaximalCliques
For Each ckB in MaximalCliques.Excluding(ckA)
If all vertices in ckA are in ckB Then MaximalCliques.Remove(ckA)
If all vertices in ckB are in ckA Then MaximalCliques.Remove(ckB)
Return MaximalCliques
次に、すべての最大クリークからクリークカバー数を見つけるための単純なアプローチが順列を介して実行され、チェックされます
MinCover = MaximalCliques.Count
For Each ckList in Permute(MaximalCliques)
Cover = 0
TestSet = Graph.Vertices
For Each ck in ckList
TestSet.Remove(ck.Vertices)
Cover = Cover + 1
If TestSet.Count = 0 Then Break
If Cover < MinCover Then MinCover = Cover
Return MinCover