fundo
Suponha que haja 2*n
pessoas para se casar e, além disso, suponha que cada pessoa seja atraída por exatamente n
outras pessoas sob as restrições de que:
- Atração é simétrica ; isto é, se pessoa
A
é atraída por pessoaB
, então pessoaB
é atraída por pessoaA
. - A atração é antitransitiva ; isto é, se pessoa
A
e pessoaB
são atraídas por pessoaC
, pessoaA
e pessoaB
não são atraídas uma pela outra.
Assim, a rede de atrações forma o gráfico bipartido completo (não direcionado) Kn,n
. Também assumimos que cada pessoa classificou as pessoas pelas quais é atraída. Eles podem ser representados como pesos das arestas no gráfico.
Um casamento é um par (A,B)
onde A
e B
são atraídos um pelo outro. O casamento é instável se houver outro casamento em que uma pessoa de cada casamento possa se divorciar do parceiro e se casar, e ambos terminem com alguém com uma classificação superior à do ex-parceiro.
Objetivo
Sua tarefa é escrever um programa ou função completa que tome as preferências de cada pessoa como entrada e produza um casamento para cada pessoa, de modo que cada casamento seja estável.
Entrada
A entrada pode estar em qualquer formato conveniente; por exemplo, gráfico ponderado, lista ordenada de preferências, dicionário / associação, etc. Você pode opcionalmente considerar o número total de pessoas como entrada, mas nenhuma outra entrada é permitida.
Resultado
A saída também pode estar em qualquer formato conveniente; por exemplo, lista de tuplas, cobertura mínima de borda , uma função que associa a cada pessoa seu parceiro, etc. Observe que a única restrição é que cada casamento é estável, não há outros requisitos de otimização.
Notas
- Você pode encontrar mais informações e um
O(n^2)
algoritmo para resolver esse problema na Wikipedia ou neste vídeo Numberphile . Você é livre para usar qualquer algoritmo, no entanto. - As brechas padrão são proibidas.
- Isso é código-golfe . A resposta mais curta (em bytes) vence.
fonte
Respostas:
Mathematica, 28 bytes
Pensaria, isso é trapaça. Eu por mim mesmo assim:
(Sim,
Combinatorica
foi preterido, mas custa menos bytes queFindIndependentEdgeSet
)Exemplo (GoT-like): (Para ser justo - adivinhei os pesos ... mas estou bem com os resultados)
fonte