Фон
Предположим, что есть 2*n
люди, которые должны состоять в браке, и далее предположим, что каждый человек привлекается именно к n
другим людям в соответствии с ограничениями, которые:
- Аттракцион симметричный ; то есть, если человек
A
привязан к человекуB
, то человекB
привязан к человекуA
. - Аттракцион антитранзитивен ; то есть, если человек
A
и человекB
привлечены к человекуC
, то человекA
и человекB
не привлечены друг к другу.
Таким образом, сеть аттракционов образует (ненаправленный) полный двудольный граф Kn,n
. Мы также предполагаем, что каждый человек оценил людей, которых он привлекает. Они могут быть представлены как граничные веса на графике.
Брак спаривание , (A,B)
где A
и B
притягиваются друг к другу. Брак нестабилен, если есть другой брак, где один человек от каждого брака может развестись со своим партнером и жениться друг на друге, и оба в конечном итоге с кем-то, кого они оценили выше, чем их бывший партнер.
Цель
Ваша задача - написать полную программу или функцию, которая принимает предпочтения каждого человека в качестве входных данных и выводит брак для каждого человека таким образом, чтобы каждый брак был стабильным.
вход
Ввод может быть в любом удобном формате; например, взвешенный график, упорядоченный список предпочтений, словарь / ассоциация и т. д. Вы можете по желанию принять общее количество людей в качестве входных данных, но другие входные данные не допускаются.
Выход
Вывод также может быть в любом удобном формате; например, список кортежей, минимальное покрытие , функция, которая связывает каждого человека с его партнером и т. д. Обратите внимание, что единственным ограничением является то, что каждый брак стабилен, других требований к оптимальности нет.
Примечания
- Вы можете найти больше информации и
O(n^2)
алгоритм для решения этой проблемы в Википедии или в этом видео Numberphile . Вы можете использовать любой алгоритм, однако. - Стандартные лазейки запрещены.
- Это код-гольф . Кратчайший ответ (в байтах) выигрывает.