Cod sursa(job #3190471)

Utilizator JeanM22ableecypm JeanM22 Data 7 ianuarie 2024 17:19:34
Problema Cc Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("cc.in");
ofstream fout("cc.out");

const int INF = 1e9;
const int MAXN = 105;
int N;
int cost[MAXN][MAXN];
int lx[MAXN], ly[MAXN];
int matchX[MAXN], matchY[MAXN];
int slack[MAXN];
bool S[MAXN], T[MAXN];
vector<int> adj[MAXN];

bool hungarianDFS(int x) {
    S[x] = true;
    for (const auto &y : adj[x]) {
        if (T[y]) continue;
        if (lx[x] + ly[y] == cost[x][y]) {
            T[y] = true;
            if (!matchY[y] || hungarianDFS(matchY[y])) {
                matchY[y] = x;
                matchX[x] = y;
                return true;
            }
        } else {
            slack[y] = min(slack[y], lx[x] + ly[y] - cost[x][y]);
        }
    }
    return false;
}

void updateLabels() {
    int x, delta = INF;
    for (x = 1; x <= N; ++x)
        if (!T[x]) delta = min(delta, slack[x]);
    for (x = 1; x <= N; ++x) {
        if (S[x]) lx[x] -= delta;
        if (T[x]) ly[x] += delta;
        else slack[x] -= delta;
    }
}

void hungarian() {
    int x, y;
    for (x = 1; x <= N; ++x) {
        matchX[x] = matchY[x] = 0;
        lx[x] = ly[x] = 0;
        for (y = 1; y <= N; ++y) {
            lx[x] = max(lx[x], cost[x][y]);
            adj[x].push_back(y);
        }
    }
    for (x = 1; x <= N; ++x) {
        for (y = 1; y <= N; ++y) slack[y] = INF;
        for (;;) {
            for (y = 1; y <= N; ++y) S[y] = T[y] = 0;
            if (hungarianDFS(x)) break;
            else updateLabels();
        }
    }
}

int main() {
    fin >> N;
    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= N; ++j)
            fin >> cost[i][j];
    hungarian();
    int sum = 0;
    for (int i = 1; i <= N; ++i)
        sum += cost[i][matchX[i]];
    fout << sum;
    return 0;
}