tło
Załóżmy, że są 2*n
ludzie do zawarcia małżeństwa, i przypuśćmy ponadto, że każda osoba jest pociągana do dokładnie n
innych osób pod ograniczeniami, które:
- Przyciąganie jest symetryczne ; tzn. jeśli dana osoba
A
jest pociągana do osobyB
, to osobaB
jest pociągana do osobyA
. - Przyciąganie jest nieprzechodnie ; tj. jeśli osoba
A
i osobaB
są przyciągane do siebieC
, wówczas osobaA
i osobaB
nie są przyciągane do siebie.
W ten sposób sieć atrakcji tworzy (nieukierowany) kompletny dwustronny wykres Kn,n
. Zakładamy również, że każda osoba uszeregowała osoby, które ich pociągają. Mogą być one przedstawione na wykresie jako grubości krawędzi.
Małżeństwo jest parowanie (A,B)
gdzie A
i B
przyciąga do siebie. Małżeństwo jest niestabilne, jeśli istnieje inne małżeństwo, w którym jedna osoba z każdego małżeństwa mogłaby rozwieść się ze swoim partnerem i poślubić się nawzajem oraz oboje skończyć z kimś, którego zajęli wyżej niż dawny partner.
Cel
Twoim zadaniem jest napisanie pełnego programu lub funkcji, które przyjmują preferencje każdej osoby jako dane wejściowe i generują małżeństwo dla każdej osoby, tak aby każde małżeństwo było stabilne.
Wejście
Dane wejściowe mogą być w dowolnym dogodnym formacie; np. wykres ważony, uporządkowana lista preferencji, słownik / przypisanie itp. Opcjonalnie możesz wziąć całkowitą liczbę osób jako dane wejściowe, ale żadne inne dane nie są dozwolone.
Wynik
Dane wyjściowe mogą być również w dowolnym dogodnym formacie; np. lista krotek, minimalne pokrycie krawędzi , funkcja, która kojarzy się każdej osobie z partnerem, itd. Należy pamiętać, że jedynym ograniczeniem jest to, że każde małżeństwo jest stabilne, nie ma innych wymagań dotyczących optymalności.
Notatki
- Możesz znaleźć więcej informacji i
O(n^2)
algorytm, aby rozwiązać ten problem na Wikipedii lub w tym filmie Numberphile . Możesz jednak użyć dowolnego algorytmu. - Standardowe luki są zabronione.
- To jest golf golfowy . Najkrótsza odpowiedź (w bajtach) wygrywa.