运动员最佳匹配问题
问题前面就不多说,简单模拟得到矩阵。
然后对矩阵用匈牙利得到最小匹配。
我累了,看代码吧
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 25;
int n;
int P[MAXN][MAXN], Q[MAXN][MAXN];
int cost[MAXN][MAXN];
int u[MAXN], v[MAXN], p[MAXN], way[MAXN];
int hungarian() {
for (int i = 1; i <= n; i++) {
p[0] = i;
int j0 = 0;
vector<int> minv(n+1, INT_MAX);
vector<bool> used(n+1, false);
do {
used[j0] = true;
int i0 = p[j0], delta = INT_MAX, j1 = 0;
for (int j = 1; j <= n; j++) {
if (!used[j]) {
int cur = -cost[i0][j] - u[i0] - v[j]; // 取负数求最大匹配
if (cur < minv[j]) {
minv[j] = cur;
way[j] = j0;
}
if (minv[j] < delta) {
delta = minv[j];
j1 = j;
}
}
}
for (int j = 0; j <= n; j++) {
if (used[j]) {
u[p[j]] += delta;
v[j] -= delta;
} else {
minv[j] -= delta;
}
}
j0 = j1;
} while (p[j0] != 0);
do {
int j1 = way[j0];
p[j0] = p[j1];
j0 = j1;
} while (j0);
}
int result = 0;
for (int j = 1; j <= n; j++) result += cost[p[j]][j];
return result;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> P[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> Q[i][j];
// 构造竞赛优势矩阵
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cost[i+1][j+1] = P[i][j] * Q[j][i];
cout << hungarian() << endl;
return 0;
}