Cod sursa(job #3186023)

Utilizator Nicoleta114Caramaliu Nicoleta Nicoleta114 Data 21 decembrie 2023 02:03:16
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace std;

const int INF = 1e9;

int algoritmUngar(vector<vector<int>>& matriceCosturi) {
    int N = matriceCosturi.size();
    int M = matriceCosturi[0].size();

    vector<int> u(N + 1, 0);
    vector<int> v(M + 1, 0);
    vector<int> p(M + 1, 0);
    vector<int> drum(M + 1, 0);

    for (int i = 1; i <= N; ++i) {
        p[0] = i;
        int j0 = 0;
        vector<int> minv(M + 1, INF);
        vector<char> folosit(M + 1, false);

        do {
            folosit[j0] = true;
            int i0 = p[j0], delta = INF, j1;

            for (int j = 1; j <= M; ++j) {
                if (!folosit[j]) {
                    int cur = matriceCosturi[i0 - 1][j - 1] - u[i0] - v[j];
                    if (cur < minv[j]) {
                        minv[j] = cur;
                        drum[j] = j0;
                    }
                    if (minv[j] < delta) {
                        delta = minv[j];
                        j1 = j;
                    }
                }
            }

            for (int j = 0; j <= M; ++j) {
                if (folosit[j]) {
                    u[p[j]] += delta;
                    v[j] -= delta;
                } else {
                    minv[j] -= delta;
                }
            }

            j0 = j1;
        } while (p[j0] != 0);

        do {
            int j1 = drum[j0];
            p[j0] = p[j1];
            j0 = j1;
        } while (j0 != 0);
    }

    return -v[0];
}

int main() {
    ifstream f("cc.in");
    ofstream g("cc.out");
    int N;
    f >> N;

    vector<vector<int>> distante(N, vector<int>(N));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            f >> distante[i][j];
        }
    }

    int distantaTotala = algoritmUngar(distante);

    g << distantaTotala << endl;

    return 0;
}