Cod sursa(job #3189846)

Utilizator LionMan101Achim-Panescu Silvian LionMan101 Data 6 ianuarie 2024 16:16:24
Problema Cc Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>

using namespace std;

void initializeVectors(int n, vector<int>& u, vector<int>& v, vector<int>& p, vector<int>& way) {
    fill(u.begin(), u.end(), 0);
    fill(v.begin(), v.end(), 0);
    fill(p.begin(), p.end(), 0);
    fill(way.begin(), way.end(), 0);
}

int updateLabels(int n, const vector<vector<int>>& distanceMatrix, vector<int>& u, vector<int>& v, vector<int>& p, vector<int>& way, int i) {
    vector<int> minv(n, INT_MAX);
    vector<char> used(n, false);
    p[0] = i;
    int j0 = 0;

    while (p[j0] != 0) {
        int i0 = p[j0], delta = INT_MAX, j1;
        used[j0] = true;
        for (int j = 1; j < n; ++j) {
            if (!used[j]) {
                int cur = distanceMatrix[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;
    }

    return j0;
}

int findMinDistance(const vector<vector<int>>& distanceMatrix) {
    int n = distanceMatrix.size();
    vector<int> u(n), v(n), p(n), way(n);

    initializeVectors(n, u, v, p, way);

    for (int i = 1; i < n; ++i) {
        int j0 = updateLabels(n, distanceMatrix, u, v, p, way, i);
        do {
            int j1 = way[j0];
            p[j0] = p[j1];
            j0 = j1;
        } while (j0);
    }

    return -v[0];
}

int main() {
    ifstream fin("input.txt");
    ofstream fout("output.txt");

    int N;
    fin >> N;
    vector<vector<int>> distanceMatrix(N + 1, vector<int>(N + 1));

    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= N; ++j) {
            fin >> distanceMatrix[i][j];
        }
    }

    fout << findMinDistance(distanceMatrix) << endl;

    fin.close();
    fout.close();

    return 0;
}