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