#include <algorithm>
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
using prii_t = pair<int, int>;
int times = 0;
bool traceback(vector<prii_t> mp, vector<vector<int>>& stat, int before, int start, int rem, int m, int k) {
if (rem == 0) {
return true;
}
for (int i = start; i < mp.size(); i++) {
times++;
int val = mp[i].first, loc = mp[i].second;
int col = loc % m, row = loc / m;
if (val < before || stat[0][col] || stat[1][row]) continue;
stat[0][col] = 1, stat[1][row] = 1;
if (traceback(mp, stat, val, start + 1, rem - 1, m, k))return true;
stat[0][col] = 0, stat[1][row] = 0;
}
return false;
}
int main()
{
int n = 150, m = 150, k = 2;
srand(time(0));
vector<vector<int>> matrix(n, vector<int>(m));
int last = 9;
for (int j = 0; j < m; j++) {
int cur = 0;
for (int i = 0; i < n; i++) {
matrix[i][j] = (rand() % last) + last / 2;
cur = max(last, matrix[i][j]);
}
last = cur;
}
vector<prii_t> mp(n * m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
mp[i * m + j] = { matrix[i][j],i * matrix[0].size() + j };
}
}
sort(mp.begin(), mp.end());
vector<vector<int>> stat(2, vector<int>(max(m, n)));
traceback(mp, stat, -1000, 0, n, m, k);
cout << times << endl;;
//10 10 4,00
//100 100 40,0000
//1000 1000 78,311017
//150 150 120,4935
}
矩阵匹配OD
最新推荐文章于 2024-07-09 10:28:12 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)