void Munkres::step4() { /* find an uncovered zero and prime it * if now starred zeros in row goto step 5 * else cover row and uncover colum of starred zero * * once no uncovered exist goto step 6. */ bool done = false; int i = 0; int j = 0; int a; while (!done) { if (find_zero(&i, &j)) { if (!is_covered(i, j)) { prime(i, j); a = starred_in_row(i); if (a == -1) // if no starred zeros { done = true; step5(i, j); } else { uncover_col(a); cover_row(i); } } } else { done = true; step6( min_uncovered()); } } }
void Munkres::solve(double* icost, int* answer, int m, int n) { rows = m; cols = n; cost = new double*[rows]; starred = new bool*[rows]; primed = new bool*[rows]; covered_rows = new bool[rows]; covered_cols = new bool[cols]; for (int i = 0; i < rows; i++) { covered_rows[i] = false; } for (int i = 0; i < cols; i++) { covered_cols[i] = false; } for (int i = 0; i < rows; i++) { cost[i] = new double[cols]; starred[i] = new bool[cols]; primed[i] = new bool[cols]; for (int j = 0; j < cols; j++) { cost[i][j] = icost[(i * cols) + j]; starred[i][j] = 0; primed[i][j] = 0; } } smallest = std::min(rows, cols); largest = std::max(rows, cols); if (rows > cols) { step0(); } else { k = min_uncovered(); step1(); } int index = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { answer[index] = starred[i][j]; index++; } } for (int i = 0; i < rows; i++) { delete cost[i]; delete primed[i]; delete starred[i]; } delete cost; delete primed; delete starred; delete covered_rows; delete covered_cols; }
std::vector<std::vector<bool> > Munkres::solve(std::vector< std::vector<double> > icost) { for(int i=0;i<icost.size();i++) { cost.push_back(std::vector<double>()); starred.push_back(std::vector<bool>()); primed.push_back(std::vector<bool>()); covered_rows.push_back(0); covered_cols.push_back(0); for(int j=0;j<icost[i].size();j++){ cost[i].push_back(icost[i][j]); starred[i].push_back(0); primed[i].push_back(0); } } size = icost.size(); k = min_uncovered(); step1(); // for(int i=0;i<icost.size();i++) { // for(int j=0;j<icost[i].size();j++){ // std::cout << starred[i][j] << ' '; // } // std::cout << std::endl; // } return starred; }
void Munkres::step0() { int minimum; for (int j = 0; j < cols; j++) { minimum = cost[0][j]; for (int i = 0; i < rows; i++) { if (minimum > cost[i][j]) { minimum = cost[i][j]; } } for (int i = 0; i < rows; i++) { cost[i][j] = cost[i][j] - minimum; } } k = min_uncovered(); step2(); }