2016-11-08 3 views
-1

У меня есть 2D-массив, где каждый элемент равен O или Non Zero, я должен собрать все элементы 1. Для этого я нанять рабочихМаксимальное соответствие в графе

`0` - dead coconut tree 
`Non Zero` - living tree 

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

  • Рабочий сталкивается с мертвым кокосовым деревом.
  • Рабочий попадает на край плантации (т. Е. В этом направлении больше нет ).

Для примера массив выглядеть следующим образом:
enter image description here

Так Минимум 4 рабочих требуется enter image description here

Вопрос:

Я был в шоке, когда я узнал, что это Maximum Matching Problem, я понятия не имел, как это так. Ниже код обозначающий Горизонтальные и вертикальные полоски с индексом

m=1; 
for (int i=0; i<r; i++) { 
     int j = 0; 
     while (j < c && a[i][j] < m) j++; 

     while (j < c) { 
      while (j < c && a[i][j] >= m) { 
       h[i][j] = hcnt; 
       j++; 
      } 
      hcnt++; 
      while (j < c && a[i][j] < m) j++; 
     } 
    } 
    int vcnt = 0; 
    for (int j=0; j<c; j++) { 
     int i = 0; 
     while (i < r && a[i][j] < m) i++; 
     while (i < r) { 
      while (i < r && a[i][j] >= m) { 
       v[i][j] = vcnt; 
       i++; 
      } 
      vcnt++; 
      while (i < r && a[i][j] < m) i++; 
     } 
    } 

Так что мой вопрос заключается в том, чтобы добавить края и почему это максимальная проблема согласования и может кто-то объяснить интуицию за этим, почему максимальное согласование работ по этой проблеме ,
Original Question

Следующий код Добавить края. Я не мастерил ни малейшего представления о том, как мы добавляем края и почему она работает

int s = 0, t = hcnt + vcnt + 1; 
    for (int i=0; i<hcnt; i++) addEdge(s, i+1, 1); 
    for (int i=0; i<r; i++) { 
     for (int j=0; j<c; j++) if(a[i][j] >= m) { 
      addEdge(1 + h[i][j], 1 + hcnt + v[i][j], 1); 
     } 
    } 
    for (int i=0; i<vcnt; i++) addEdge(1 + hcnt + i, t, 1); 

ответ

1

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

Каждая ячейка с деревом становится реброми на графике. Каждая вертикальная линия становится вершиной в левой части графика, и каждая горизонтальная линия становится вершиной в правой части. Теперь проблема эквивалентна нахождению вершинного покрытия в этом графе. Размер максимального совпадения равен размеру крышки вершин на любом двудольном графе (это более или менее известная теорема).