rt,用下面这份代码跑最佳完美匹配的最小权值和,在任意数据下可能会出现死循环吗。
#include <bits/stdc++.h>
using namespace std;
const int M = 105;
int n, w[M][M], wx[M], wy[M], to_y[M], get, ans;
bool dfs(int), vis_x[M], vis_y[M];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &w[i][j]);
for (int i = 1; i <= n; i++) {
wx[i] = INT_MIN;
for (int j = 1; j <= n; j++)
w[i][j] *= -1,
wx[i] = max(wx[i], w[i][j]);
}
for (int i = 1; i <= n; i++) {
while (1) {
get = INT_MAX;
memset(vis_x, false, sizeof(vis_x));
memset(vis_y, false, sizeof(vis_y));
if (dfs(i))
break;
for (int i = 1; i <= n; i++) {
if (vis_x[i])
wx[i] -= get;
if (vis_y[i])
wy[i] += get;
}
}
}
for (int i = 1; i <= n; i++)
ans += w[to_y[i]][i];
printf("%d", -ans);
return 0;
}
bool dfs(int x) {
vis_x[x] = 1;
for (int i = 1; i <= n; i++) {
if (!vis_y[i]) {
int num = wx[x] + wy[i] - w[x][i];
if (!num) {
vis_y[i] = 1;
if (!to_y[i] || dfs(to_y[i])) {
to_y[i] = x;
return 1;
}
}
else
get = min(get, num);
}
}
return 0;
}