int Munkres::step4(void) { int rows = matrix.rows(); int cols = matrix.columns(); std::list<std::pair<int,int> > seq; // use saverow, savecol from step 3. std::pair<int,int> z0(saverow, savecol); std::pair<int,int> z1(-1,-1); std::pair<int,int> z2n(-1,-1); seq.insert(seq.end(), z0); int row, col = savecol; /* Increment Set of Starred Zeros 1. Construct the ``alternating sequence'' of primed and starred zeros: Z0 : Unpaired Z' from Step 4.2 Z1 : The Z* in the column of Z0 Z[2N] : The Z' in the row of Z[2N-1], if such a zero exists Z[2N+1] : The Z* in the column of Z[2N] The sequence eventually terminates with an unpaired Z' = Z[2N] for some N. */ bool madepair; do { madepair = false; for ( row = 0 ; row < rows ; row++ ) if ( mask_matrix(row,col) == STAR ) { z1.first = row; z1.second = col; if ( pair_in_list(z1, seq) ) continue; madepair = true; seq.insert(seq.end(), z1); break; } if ( !madepair ) break; madepair = false; for ( col = 0 ; col < cols ; col++ ) if ( mask_matrix(row,col) == PRIME ) { z2n.first = row; z2n.second = col; if ( pair_in_list(z2n, seq) ) continue; madepair = true; seq.insert(seq.end(), z2n); break; } } while ( madepair ); for ( std::list<std::pair<int,int> >::iterator i = seq.begin() ; i != seq.end() ; i++ ) { // 2. Unstar each starred zero of the sequence. if ( mask_matrix(i->first,i->second) == STAR ) mask_matrix(i->first,i->second) = NORMAL; // 3. Star each primed zero of the sequence, // thus increasing the number of starred zeros by one. if ( mask_matrix(i->first,i->second) == PRIME ) mask_matrix(i->first,i->second) = STAR; } // 4. Erase all primes, uncover all columns and rows, for ( int row = 0 ; row < mask_matrix.rows() ; row++ ) for ( int col = 0 ; col < mask_matrix.columns() ; col++ ) if ( mask_matrix(row,col) == PRIME ) mask_matrix(row,col) = NORMAL; for ( int i = 0 ; i < rows ; i++ ) { row_mask[i] = false; } for ( int i = 0 ; i < cols ; i++ ) { col_mask[i] = false; } // and return to Step 2. return 2; }
/*! Increment Set of Starred Zeros 1. Construct the ``alternating sequence'' of primed and starred zeros: Z0 : Unpaired Z' from Step 4.2 Z1 : The Z* in the column of Z0 Z[2N] : The Z' in the row of Z[2N-1], if such a zero exists Z[2N+1] : The Z* in the column of Z[2N] The sequence eventually terminates with an unpaired Z' = Z[2N] for some N. */ int Munkres::step4(void) { std::list<std::pair<int,int> > seq; // use saverow, savecol from step 3. std::pair<int,int> z0(saverow, savecol); std::pair<int,int> z1(-1,-1); std::pair<int,int> z2n(-1,-1); seq.insert(seq.end(), z0); unsigned row, col = savecol; bool madepair; do { madepair = false; for ( row = 0 ; row < matrix.rows() ; row++ ) if ( mask_matrix(row,col) == Z_STAR ) { z1.first = row; z1.second = col; if ( pair_in_list(z1, seq) ) continue; madepair = true; seq.insert(seq.end(), z1); break; } if ( !madepair ) break; madepair = false; for ( col = 0 ; col < matrix.columns() ; col++ ) if ( mask_matrix(row,col) == Z_PRIME ) { z2n.first = row; z2n.second = col; if ( pair_in_list(z2n, seq) ) continue; madepair = true; seq.insert(seq.end(), z2n); break; } } while ( madepair ); for ( std::list<std::pair<int,int> >::iterator i = seq.begin() ; i != seq.end() ; i++ ) { // 2. Unstar each starred zero of the sequence. if ( mask_matrix(i->first,i->second) == Z_STAR ) mask_matrix(i->first,i->second) = Z_NORMAL; // 3. Star each primed zero of the sequence, // thus increasing the number of starred zeros by one. if ( mask_matrix(i->first,i->second) == Z_PRIME ) mask_matrix(i->first,i->second) = Z_STAR; } // 4. Erase all primes, uncover all columns and rows, for ( unsigned row = 0 ; row < mask_matrix.rows() ; row++ ) for ( unsigned col = 0 ; col < mask_matrix.columns() ; col++ ) if ( mask_matrix(row,col) == Z_PRIME ) mask_matrix(row,col) = Z_NORMAL; for ( unsigned i = 0 ; i < matrix.rows() ; i++ ) { row_mask[i] = false; } for ( unsigned i = 0 ; i < matrix.columns() ; i++ ) { col_mask[i] = false; } // and return to Step 2. return 2; }