vector<pair<int, int> > getMatch(V2D vX, V2D vY) { X = vX; Y = vY; SZ = X.size(); for(int i = 0; i < SZ; ++i) for(int j = 0; j < SZ; ++j) Y[i][vY[i][j]] = j; mX.assign(SZ, -1); mY.assign(SZ, -1); k.assign(SZ, 0); bool yes = true; while(true) { bool mark = true; int i; for(i = 0; i < SZ; ++i) { if(mX[i] == -1) { while(k[i] < SZ) { int j = X[i][k[i]]; if( mY[j] == -1 ) { mX[i] = j; mY[j] = i; break; } if( Y[j][i] < Y[j][mY[j]] ) { mX[mY[j]] = -1; k[mY[j]]++; mX[i] = j; mY[j] = i; break; } ++k[i]; } if(mX[i] == -1) mark = false; break; } } if(i == N) break; if(!mark) { yes = false; break; } } vector<pair<int, int> > ans(0); if(!yes) return ans; for(int i = 0; i < SZ; ++i) ans.push_back(make_pair(i, mX[i])); return ans; }