Przeskocz do treści

Delta mi!

Kliki

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: marzec 2013
  • Publikacja elektroniczna: 01-03-2013
  • Wersja do druku [application/pdf]: (83 KB)

Dany jest graf nieskierowany math Kliką nazwiemy taki podzbiór wierzchołków math że każde dwa wierzchołki w zbiorze math są połączone krawędzią w grafie math Problem znalezienia w grafie kliki o jak największej liczbie wierzchołków jest NP-zupełny, a jak wiadomo, dla takich problemów nikt jeszcze nie pokazał algorytmu wielomianowego. Podobne trudności są z algorytmem dla problemu zliczania klik w grafie, choć tutaj stosowną klasę złożoności stanowią tzw. problemy #P-zupełne.

Nic więc dziwnego, że gdy takie właśnie zadanie pojawiło się na obozie w Petrozawodzku w 2009 r. (zadanie pt. Work for Robots), nie oczekiwano od zawodników rozwiązania wielomianowego. Występujące w zadaniu ograniczenie math wymagało jednak zastosowania nietrywialnego algorytmu wykładniczego.

Niech math Nasz algorytm będzie wykonywał różne operacje na podzbiorach zbioru math Podzbiory takie będziemy reprezentowali jako maski bitowe o długości math (ponieważ math każda taka maska zmieści się w 64-bitowej zmiennej całkowitej). W pseudokodach będziemy zapisywać operacje sumy, iloczynu i różnicy zbiorów przy użyciu standardowej symboliki matematycznej, ale implementując program, można je równie prosto zapisać przy użyciu operacji bitowych (patrz Delta 11/2008). Niech math oznacza zbiór wierzchołków, z którymi połączony jest wierzchołek math Przez math oznaczamy liczbę klik, które są zawarte w podzbiorze math (wynikiem programu będzie math). Dla math  mamy dokładnie jedną taką klikę (pustą). Załóżmy zatem, że math  dla pewnego wierzchołka math Każda klika zawarta w  math jest albo całkowicie zawarta w  math albo zawiera wierzchołek math i jest zawarta w  math

Poniższy pseudokod pokazuje, jak wypełniać tablicę math:

display-math

Powyższe rozwiązanie działa w czasie math

Szybsze rozwiązanie uzyskamy następująco. Podzielmy zbiór wierzchołków na dwa możliwie równe podzbiory math  Na początek wykonajmy powyższy algorytm, ale tylko dla wierzchołków ze zbioru math zajmie to czas math  Zbiór math  jest kliką dokładnie wtedy, gdy oba zbiory math  są klikami oraz istnieją wszystkie krawędzie między nimi. Rozważmy pewien math który jest kliką. Oznaczmy

display-math

czyli zbiór tych wierzchołków, które są połączone ze wszystkimi wierzchołkami z  math Wówczas klika math dla której math musi spełniać math  Ostatecznie wynikiem jest:

display-math

przy czym warunek sumy oznacza po prostu, że math jest kliką.

To, czego nam teraz potrzeba, to obliczenie math dla wszystkich math Robimy to podobnie jak w przypadku tablicy math:

display-math

Całe rozwiązanie działa w czasie math  Jako zadanie dla Czytelnika proponujemy przerobić ten algorytm tak, by znajdował najliczniejszą klikę.