Cod sursa(job #2487092)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 3 noiembrie 2019 22:05:13
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
#define DIM 205

using namespace std;

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

int n, m, i, j, a, sursa, destinatie, sol;
int d[DIM], t[DIM];
int cost[DIM][DIM], capacitate[DIM][DIM], flux[DIM][DIM];

vector <int> L[DIM];

queue <int> q;

bitset <DIM> f;

int bellmanford (){
    int gasit, nod, vecin;
    for (int i=0; i<=2*n+1; i++){
        d[i] = INT_MAX;
    }
    f.reset();
    d[sursa] = 0;
    f[sursa] = 1;
    gasit = 0;
    q.push(sursa);
    while (!q.empty()){
        nod = q.front();
        f[nod] = 0;
        q.pop();
        for (int i=0; i<L[nod].size(); i++){
            vecin = L[nod][i];
            if (d[vecin] > d[nod] + cost[nod][vecin] && capacitate[nod][vecin] > flux[nod][vecin]){
                d[vecin] = d[nod] + cost[nod][vecin];
                t[vecin] = nod;
                if (f[vecin] == 0){
                    f[vecin] = 1;
                    q.push(vecin);
                    if (vecin == destinatie){
                        gasit = 1;
                    }
                }
                t[vecin] = nod;
            }
        }
    }
    return gasit;
}

int main(){
    fin >> n;
    for (i=1; i<=n; i++){
        for (j=1; j<=n; j++){
            fin >> a;
            L[i].push_back(n+j);
            L[n+j].push_back(i);
            capacitate[i][n+j] = 1;
            cost[i][n+j] = a, cost[n+j][i] = -a;
        }
    }
    destinatie = 2*n + 1, sursa = 0;
    for(i=1; i<=n; i++){
        L[0].push_back(i);
        capacitate[0][i] = 1;
        L[i].push_back(0);
        L[destinatie].push_back(n+i);
        L[n+i].push_back(destinatie);
        capacitate[n+i][destinatie] = 1;
    }
    while(bellmanford()){
        int nod = destinatie;
        while(nod){
            flux[t[nod]][nod]++;
            flux[nod][t[nod]]--;
            nod = t[nod];
        }
        sol += d[destinatie];
    }
    fout << sol;
    return 0;
}