sfondo
Supponiamo che ci siano 2*n
persone da sposare e supponiamo inoltre che ogni persona sia attratta esattamente da n
altre persone sotto i vincoli che:
- L'attrazione è simmetrica ; cioè se la persona
A
è attratta da personaB
, allora la personaB
è attratta da personaA
. - L'attrazione è antitransitiva ; cioè se persona
A
e personaB
sono attratte ciascuna da personaC
, allora personaA
e personaB
non sono attratte l'una dall'altra.
Pertanto la rete di attrazioni costituisce il grafico bipartito completo (non indirizzato) Kn,n
. Supponiamo anche che ogni persona abbia classificato le persone a cui sono attratte. Questi possono essere rappresentati come spigoli del bordo nel grafico.
Un matrimonio è un accoppiamento in (A,B)
cui A
e B
sono attratti l'uno dall'altro. Il matrimonio è instabile se esiste un altro matrimonio in cui una persona per ciascun matrimonio può divorziare dal proprio partner e sposarsi a vicenda ed entrambi finiscono con qualcuno che hanno classificato più in alto rispetto al loro ex partner.
Obbiettivo
Il tuo compito è quello di scrivere un programma o una funzione completa che prenda le preferenze di ogni persona come input e produca un matrimonio per ogni persona in modo tale che ogni matrimonio sia stabile.
Ingresso
L'input può essere in qualsiasi formato conveniente; ad es. grafico ponderato, elenco ordinato di preferenze, dizionario / associazione, ecc. È possibile prendere facoltativamente il numero totale di persone come input, ma non è consentito nessun altro input.
Produzione
L'output può anche essere in qualsiasi formato conveniente; es. elenco di tuple, copertura minima del bordo , una funzione che associa a ciascuna persona il proprio partner, ecc. Si noti che l'unico vincolo è che ogni matrimonio è stabile, non ci sono altri requisiti di ottimalità.
Appunti
- Puoi trovare ulteriori informazioni e un
O(n^2)
algoritmo per risolvere questo problema su Wikipedia o su questo video di Numberphile . Sei libero di usare qualsiasi algoritmo, comunque. - Sono vietate le scappatoie standard .
- Questo è code-golf . La risposta più breve (in byte) vince.