tło
W chwili pisania tego, P vs problemu NP jest nadal nierozwiązane, ale może słyszeliście o nowej papieru Norberta Bluma dowód twierdząc, że P! = NP, która jest już podejrzewa się błędne (ale zobaczymy).
Problemem omawianym w tym artykule jest problem kliki . Przynajmniej tak czytam w artykule w gazecie, więc popraw mnie, jeśli się mylę, ale w każdym razie chciałbym, abyś napisał program, który rozwiązuje następujący wariant:
Zadanie
Załóżmy, że mamy dużą szkołę z dużą liczbą uczniów. Każdy z tych uczniów ma w tej szkole przyjaciół. Klika studentów to grupa składająca się wyłącznie ze studentów, którzy są przyjaciółmi z każdego innego członka .
Twój program otrzyma pary studentów, którzy są przyjaciółmi jako wkład. Na podstawie tych informacji program musi znaleźć rozmiar największej kliki . Studenci są identyfikowani za pomocą liczb całkowitych .
Jeśli wolisz terminy matematyczne, oznacza to, że zasilasz krawędzie niekierowanego wykresu, identyfikowanego przez dwa węzły każdy.
Wkład
Twoje dane wejściowe będą niepustą listą dodatnich par liczb całkowitych, np [[1,2],[2,5],[1,5]]
. Możesz wprowadzić te dane w dowolnej rozsądnej formie, np. Jako tablicę tablic, jako wiersze tekstu zawierające dwie liczby, itd.
Wydajność
Oczekiwany wynik to jedna liczba n >= 2
: wielkość największej kliki. Z powyższego przykładu wejścia, wynik będzie 3
, jak wszyscy uczniowie ( 1
, 2
i 5
) są przyjaciółmi z siebie.
Przypadki testowe
[[1,2]]
=> 2
[[1,2],[3,1],[3,4]]
=> 2
[[1,2],[2,5],[1,5]]
=> 3
[[2,5],[2,3],[4,17],[1,3],[7,13],[5,3],[4,3],[4,1],[1,5],[5,4]]
=> 4 (the largest clique is [1,3,4,5])
[[15,1073],[23,764],[23,1073],[12,47],[47,15],[1073,764]]
=> 3 (the largest clique is [23,764,1073])
[[1296,316],[1650,316],[1296,1650],[1296,52],[1650,711],[711,316],[1650,52],
[52,711],[1296,711],[52,316],[52,1565],[1565,1296],[1565,316],[1650,1565],
[1296,138],[1565,138],[1565,711],[138,1650],[711,138],[138,144],[144,1860],
[1296,1860],[1860,52],[711,1639]]
=> 6 (the largest clique is [52,316,711,1296,1565,1650])
Możesz użyć tej (głupiej) implementacji referencyjnej (drukuje dodatkowe wyjście z -d
flagą) do weryfikacji wyników innych przypadków testowych.
Zasady
- Twój program nie potrzebuje określonego wyniku przy nieprawidłowym wprowadzaniu danych. Możesz więc założyć, że:
- zawsze otrzymasz przynajmniej jedną parę identyfikatorów
- każda para składa się z dwóch różnych identyfikatorów
- żadna para nie pojawia się dwa razy (zamiana miejsc identyfikatorów nadal byłaby tą samą parą)
- Twój algorytm nie może ustawić górnej granicy rozmiaru wejściowego. Ograniczenia czysto techniczne i ograniczenia określone przez Twój język / środowisko (takie jak rozmiar stosu, czas obliczeń itp.) Są oczywiście nieuniknione.
- Standardowe luki są zabronione.
- To jest golf golfowy , więc wygrywa najkrótszy kod, mierzony w bajtach.
- Jeśli algorytm ma złożoność czasową wielomianową, wynik jest
-1
natychmiastowy niezależnie od rozmiaru kodu, ale w takim przypadku możesz przesłać swoje rozwiązanie gdzie indziej. ;)
-1
jest zasłużony ;)