sfondo
Al momento della stesura di questo, il problema P vs NP è ancora irrisolto, ma potresti aver sentito parlare del nuovo documento di Norbert Blum che afferma la prova che P! = NP, che è già sospettato di essere errato (ma vedremo).
Il problema discusso in questo documento è il problema della cricca . Almeno questo è quello che ho letto in un articolo di giornale, quindi correggimi se sbaglio, ma in ogni caso, vorrei che tu scrivessi un programma che risolva la seguente variante:
L'obiettivo
Supponiamo di avere una grande scuola con molti studenti. Ognuno di questi studenti ha alcuni amici in questa scuola. Una cricca di studenti è un gruppo composto solo da studenti amici degli altri membri .
Il tuo programma riceverà coppie di studenti amici come input. Da queste informazioni, il programma deve trovare la dimensione della cricca più grande . Gli studenti sono identificati da ID interi .
Se preferisci termini matematici, questo significa che sei alimentato dai bordi di un grafico non orientato, identificato da due nodi ciascuno.
Ingresso
Il tuo input sarà un elenco non vuoto di coppie di numeri interi positivi, ad es [[1,2],[2,5],[1,5]]
. Puoi prendere questo input in qualsiasi forma ragionevole, ad esempio come una matrice di matrici, come righe di testo contenenti due numeri ciascuna, ecc ...
Produzione
L'output previsto è un singolo numero n >= 2
: la dimensione della cricca più grande. Con l'ingresso esempio di cui sopra, il risultato sarebbe stato 3
, come tutti gli studenti ( 1
, 2
e 5
) sono amici tra di loro.
Casi test
[[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])
È possibile utilizzare questa (stupida) implementazione di riferimento (stampa un output extra con -d
flag) per verificare i risultati di altri casi di test.
Le regole
- Il tuo programma non ha bisogno di un risultato definito su input non validi. Quindi puoi presumere che:
- otterrai sempre almeno una coppia di ID
- ogni coppia è composta da due ID diversi
- nessuna coppia appare due volte (scambiando i posti degli ID sarebbe sempre la stessa coppia)
- Al tuo algoritmo non è consentito impostare un limite superiore sulla dimensione di input. Le limitazioni puramente tecniche e le limitazioni stabilite dalla tua lingua / ambiente (come dimensioni dello stack, tempo di calcolo, ecc.) Sono ovviamente inevitabili.
- Sono vietate le scappatoie standard.
- Questo è code-golf , quindi vince il codice più breve, misurato in byte.
- Se l'algoritmo presenta una complessità temporale polinomiale, ottieni un punteggio
-1
immediatamente indipendentemente dalla dimensione del codice, ma in tal caso, potresti voler inviare la tua soluzione da qualche altra parte. ;)
-1
è ben meritato ;)