Описание проблемы
У нас есть один работодатель, который хочет опросить людей N, и поэтому делает N слотов для интервью. У каждого человека есть график свободных занятий для этих слотов. Дайте алгоритм, который планирует N людей в N слотов, если это возможно, и вернуть флаг/ошибку/etc, если это невозможно. Какова самая быстрая возможная сложность выполнения?
Мои подходы до сих пор
Наивный: есть N! способы запланировать N людей. Пройдите через все из них, для каждой перестановки проверьте, выполнимо ли это. O (n!)
Откат:
- Ищите какие-либо слоты для интервью, в которых может быть только 1 человек. Запланируйте человека, удалите его из списка кандидатов и удалите слот.
- Ищите кандидатов, которые могут попасть только в 1 слот. Запланируйте человека, удалите его из списка кандидатов и удалите слот.
- Повторяйте 1 и 2, пока не будет таких комбинаций.
- Выберите человека, скопируйте его случайным образом в один из доступных слотов. Помните эту операцию.
- Повторяйте 1, 2, 3 до тех пор, пока у нас не будет графика или не будет неразрешимого конфликта. Если у нас есть график, верните его. Если есть неразрешимый конфликт, откат.
Это самый худший случай O (n!), я думаю - это не лучше.
Там может быть D.P. решение, но я еще не вижу его.
Другие мысли
Проблема может быть представлена в матрице NxN, где строки являются "слотами", столбцы - "люди", а значения "1" свободны и "0" для занятости. Затем мы ищем матрицу идентичности с разбивкой по столбцу в этой матрице. Шаги 1 и 2 ищут строку или столбец только с одним "1". (Если ранг матрицы равен N, то это означает, что существует решение, но противоположное не выполняется) Другой способ взглянуть на это - обработать матрицу как неважную направленную графовую матрицу графа. Затем каждый из узлов представляет 1 кандидата и 1 слот. Затем мы ищем набор ребер, чтобы каждый node в графе имел один исходящий ребро и один входящий фронт. Или, с 2x узлами, это будет двудольный граф.
Пример матрицы:
1 1 1 1
0 1 1 0
1 0 0 1
1 0 0 1