fundo
No momento em que escrevemos isso, o problema P vs NP ainda não foi resolvido, mas você deve ter ouvido falar do novo artigo de Norbert Blum reivindicando a prova de que P! = NP, que já é suspeito de estar errado (mas veremos).
O problema discutido neste artigo é o problema da camarilha . Pelo menos é o que li em um artigo de jornal, então me corrija se estiver errado, mas, de qualquer forma, gostaria que você escrevesse um programa que resolva a seguinte variante:
A tarefa
Suponha que tenhamos uma escola grande com muitos alunos. Cada um desses alunos tem alguns amigos nesta escola. Uma camarilha de estudantes é um grupo composto apenas por alunos que são amigos um do outro .
Seu programa receberá pares de alunos amigos como entrada. A partir dessas informações, o programa deve encontrar o tamanho da maior clique . Os alunos são identificados por IDs inteiros .
Se você preferir termos matemáticos, isso significa que você alimenta as bordas de um gráfico não direcionado, identificado por dois nós cada.
Entrada
Sua entrada será uma lista não vazia de pares inteiros positivos, por exemplo [[1,2],[2,5],[1,5]]
. Você pode receber esta entrada de qualquer forma sensata, por exemplo, como uma matriz de matrizes, como linhas de texto contendo dois números cada, etc ...
Saída
A saída esperada é um número único n >= 2
: o tamanho da maior clique. Com a entrada de exemplo acima, o resultado seria 3
, pois todos os alunos ( 1
, 2
e 5
) são amigos um do outro.
Casos de teste
[[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])
Você pode usar essa implementação de referência (estúpida) (imprime saída extra com -d
sinalizador) para verificar os resultados de outros casos de teste.
As regras
- Seu programa não precisa de um resultado definido com entrada inválida. Então você pode assumir que:
- você sempre terá pelo menos um par de IDs
- cada par consiste em dois IDs diferentes
- nenhum par aparece duas vezes (a troca dos locais dos IDs ainda seria o mesmo par)
- Seu algoritmo não tem permissão para definir um limite superior no tamanho da entrada. Limitações puramente técnicas e definidas pelo seu idioma / ambiente (como tamanho da pilha, tempo de computação etc.) são obviamente inevitáveis.
- As brechas padrão são proibidas.
- Isso é código-golfe , então o código mais curto, medido em bytes, vence.
- Se o seu algoritmo tiver complexidade de tempo polinomial, você pontua
-1
imediatamente, independentemente do tamanho do código, mas nesse caso, convém enviar sua solução para outro lugar. ;)
-1
é bem merecida ;)