Antecedentes
Suponga que hay 2*n
personas para casarse, y suponga además que cada persona se siente atraída por n
otras exactamente bajo las restricciones que:
- La atracción es simétrica ; es decir, si la persona
A
se siente atraída por la personaB
, entoncesB
se atrae a la personaA
. - La atracción es antitransitiva ; es decir, si la persona
A
y la personaB
se sienten atraídas por la personaC
, entonces la personaA
y la personaB
no se sienten atraídas entre sí.
Así, la red de atracciones forma el gráfico bipartito completo (no dirigido) Kn,n
. También suponemos que cada persona ha clasificado a las personas que le atraen. Estos pueden representarse como pesos de borde en el gráfico.
Un matrimonio es un emparejamiento (A,B)
donde A
y B
se sienten atraídos el uno al otro. El matrimonio es inestable si hay otro matrimonio en el que una persona de cada matrimonio podría divorciarse de su pareja y casarse entre sí y ambos terminan con alguien que clasificaron más alto que su pareja anterior.
Objetivo
Su tarea es escribir un programa o función completa que tome las preferencias de cada persona como entrada y produzca un matrimonio para cada persona de modo que cada matrimonio sea estable.
Entrada
La entrada puede estar en cualquier formato conveniente; por ejemplo, gráfico ponderado, lista ordenada de preferencias, diccionario / asociación, etc. Opcionalmente, puede tomar el número total de personas como entrada, pero no se permite ninguna otra entrada.
Salida
La salida también puede estar en cualquier formato conveniente; por ejemplo, lista de tuplas, cobertura mínima de borde , una función que asocia a cada persona su pareja, etc. Tenga en cuenta que la única restricción es que cada matrimonio es estable, no hay otros requisitos de optimización.
Notas
- Puede encontrar más información y un
O(n^2)
algoritmo para resolver este problema en Wikipedia o en este video de Numberphile . Sin embargo, puede utilizar cualquier algoritmo. - Las lagunas estándar están prohibidas.
- Este es el código de golf . La respuesta más corta (en bytes) gana.