Как найти минимальное количество строк, необходимое для покрытия всех нулей в двумерном массиве?

Я пытаюсь сделать достойную реализацию венгерского алгоритма, однако я застрял в том, как найти минимальное количество строк, которые покрывают все нули в массиве

Также мне нужно знать эти строки, чтобы сделать некоторые вычисления позже

вот объяснение:

http://www.ams.jhu.edu/~castello/362/Handouts/hungarian.pdf

на шаге 3 говорится

Используйте как можно меньше строк, чтобы покрыть все нули в матрице. Нет простого правила сделать это - в основном методом проб и ошибок.

что означает метод проб и ошибок с точки зрения вычислений? Если у меня есть, например, 2d массив из 5 строк и 5 столбцов, то

Первый ряд может охватывать все нули, первый и второй, первый ряд и первый столбец и т. Д., Слишком много комбинаций

разве нет ничего более эффективного, чем это?

заранее спасибо

3 ответа

Вы должны реализовать алгоритм двойного соответствия здесь. У вас есть два разбиения в графе - вершины в одном из них представляют строки, а вершины в другом представляют столбцы в таблице. Между строкойi и столбцомj есть ребро, если в ячейке есть 1 (i,j). Затем вы создаете максимальное двустороннее соответствие. После последней итерации алгоритма двудольного сопоставления вам нужно выяснить, какие вершины соединены через инкрементальный путь с источником для вашего сопоставления. Инкрементальный путь - это путь, использующий только ребра с положительной емкостью. Вы должны иметь изображение, как:

         row_1                  col_1
        /                             \
       / - row_2                col_2 -\
source  - ....     some_edges           \ sink
       \                                / 
        \ - row_n                col_n /
                                 .... /
                                 col_m

После того, как вы найдете максимальное двойное соответствие, найдите, какие строки и столбцы доступны через ребра положительной емкости из приемника. Теперь минимальное количество строк и столбцов, которое вам нужно очистить, определяется с помощью следующего алгоритма: вы вычеркиваете все строки, которые не достижимы из источника, и все столбцы, которые достижимы, и это ваше оптимальное решение.

Надеюсь, этот ответ поможет вам.

Я не совсем уверен, почему они сказали вам делать проб и ошибок. Однако венгерский алгоритм не требует экспоненциального времени. Взгляните на википедию, в которой вы найдете пример того, как определить минимальное количество строк (см. Шаг 3):

http://en.wikipedia.org/wiki/Hungarian_algorithm

Статья также содержит ссылки на реализации и некоторые заметки онлайн-курса, которые дают более полное (хотя и более техническое) описание венгерского алгоритма, чем тот, который вы используете.

Метод проб и ошибок означает сложность O((n+m)!).

Самое большее, вам нужно будет выбрать только min(n,m) строк, так как выбор всех строк или столбцов охватит все 0.

Я бы реализовал алгоритм динамического программирования, чтобы решить этот шаг для больших проблем.

Другие вопросы по тегам