在该题输入数据格式的保证下用KM跑最小权值和可能死循环吗
查看原帖
在该题输入数据格式的保证下用KM跑最小权值和可能死循环吗
177000
vicky2048_2楼主2023/9/12 16:41

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;
}
2023/9/12 16:41
加载中...