Kliki
Dany jest graf nieskierowany Kliką nazwiemy taki podzbiór wierzchołków że każde dwa wierzchołki w zbiorze są połączone krawędzią w grafie 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 wymagało jednak zastosowania nietrywialnego algorytmu wykładniczego.
Niech Nasz algorytm będzie wykonywał różne operacje na podzbiorach zbioru Podzbiory takie będziemy reprezentowali jako maski bitowe o długości (ponieważ 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 oznacza zbiór wierzchołków, z którymi połączony jest wierzchołek Przez oznaczamy liczbę klik, które są zawarte w podzbiorze (wynikiem programu będzie ). Dla mamy dokładnie jedną taką klikę (pustą). Załóżmy zatem, że dla pewnego wierzchołka Każda klika zawarta w jest albo całkowicie zawarta w albo zawiera wierzchołek i jest zawarta w
Poniższy pseudokod pokazuje, jak wypełniać tablicę :
Powyższe rozwiązanie działa w czasie
Szybsze rozwiązanie uzyskamy następująco. Podzielmy zbiór wierzchołków na dwa możliwie równe podzbiory Na początek wykonajmy powyższy algorytm, ale tylko dla wierzchołków ze zbioru zajmie to czas Zbiór jest kliką dokładnie wtedy, gdy oba zbiory są klikami oraz istnieją wszystkie krawędzie między nimi. Rozważmy pewien który jest kliką. Oznaczmy
czyli zbiór tych wierzchołków, które są połączone ze wszystkimi wierzchołkami z Wówczas klika dla której musi spełniać Ostatecznie wynikiem jest:
przy czym warunek sumy oznacza po prostu, że jest kliką.
To, czego nam teraz potrzeba, to obliczenie dla wszystkich Robimy to podobnie jak w przypadku tablicy :
Całe rozwiązanie działa w czasie Jako zadanie dla Czytelnika proponujemy przerobić ten algorytm tak, by znajdował najliczniejszą klikę.