sfondo
Supponiamo che ci siano 2*npersone da sposare e supponiamo inoltre che ogni persona sia attratta esattamente da naltre 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
Ae personaBsono attratte ciascuna da personaC, allora personaAe personaBnon 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 Ae Bsono 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.

