Contexte
Au moment d'écrire ces lignes, le problème P vs NP n'est toujours pas résolu, mais vous avez peut-être entendu parler du nouveau document de Norbert Blum prétendant prouver que P! = NP, qui est déjà soupçonné d'être erroné (mais nous verrons).
Le problème discuté dans cet article est le problème de la clique . C'est du moins ce que j'ai lu dans un article de journal, alors corrigez-moi si je me trompe, mais en tout cas, j'aimerais que vous écriviez un programme qui résout la variante suivante:
La tâche
Supposons que nous ayons une grande école avec beaucoup d'étudiants. Chacun de ces élèves a des amis dans cette école. Une clique d'étudiants est un groupe composé uniquement d'étudiants qui sont amis entre eux .
Votre programme recevra des paires d'étudiants amis comme contribution. À partir de ces informations, le programme doit trouver la taille de la plus grande clique . Les étudiants sont identifiés par des identifiants entiers .
Si vous préférez les termes mathématiques, cela signifie que vous êtes alimenté par les bords d'un graphique non orienté, identifié par deux nœuds chacun.
Contribution
Votre entrée sera une liste non vide de paires entières positives, par exemple [[1,2],[2,5],[1,5]]
. Vous pouvez prendre cette entrée sous n'importe quelle forme sensible, par exemple comme un tableau de tableaux, comme des lignes de texte contenant deux nombres chacune, etc ...
Sortie
La sortie attendue est un nombre unique n >= 2
: la taille de la plus grande clique. Avec l'exemple saisi ci-dessus, le résultat serait 3
, car tous les élèves ( 1
, 2
et 5
) sont amis les uns avec les autres.
Cas de 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])
Vous pouvez utiliser cette implémentation de référence (stupide) (imprime une sortie supplémentaire avec -d
indicateur) pour vérifier les résultats d'autres cas de test.
Les règles
- Votre programme n'a pas besoin d'un résultat défini sur une entrée non valide. Vous pouvez donc supposer que:
- vous obtiendrez toujours au moins une paire d'identifiants
- chaque paire se compose de deux identifiants différents
- aucune paire n'apparaît deux fois (l'échange des emplacements des identifiants serait toujours la même paire)
- Votre algorithme n'est pas autorisé à définir une limite supérieure sur la taille d'entrée. Les limitations purement techniques et les limitations fixées par votre langage / environnement (comme la taille de la pile, le temps de calcul, etc.) sont bien sûr inévitables.
- Les failles standard sont interdites.
- C'est le code-golf , donc le code le plus court, mesuré en octets, gagne.
- Si votre algorithme a une complexité temporelle polynomiale, vous marquez
-1
immédiatement quelle que soit la taille de votre code, mais dans ce cas, vous souhaiterez peut-être soumettre votre solution ailleurs. ;)
-1
c'est bien mérité ;)