Cod sursa(job #2250634)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 30 septembrie 2018 15:07:53
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<fstream>
using namespace std;
ifstream in ("cc.in");
ofstream out ("cc.out");
int c[203*203],coada[203*203], tata[204],flux[204][204],cap[204][204],hz[204],cost[204][204];
long long total;
int n,s,f;
bool bellmanford () {
    for (int i = s; i <= f; i ++) {
        c[i] = 0;
        hz[i] = 0;
        tata[i] = 0;
    }
    c[s] = 1;
    hz[s] = 1;
    coada[1] = s;
    for (int st = 1, dr = 1; st <= dr; st ++) {
        int a = coada[st];
        for (int i = s; i <= f; i ++ ) {
            int b = i;
            if (flux[a][b] < cap[a][b] && (c[b] > c[a] + cost[a][b] || tata[b] == 0)) {
                if (hz[b] == 0) {
                    hz[b] = 1;
                    coada[++dr] = b;
                    c[b] = c[a] + cost[a][b];
                }
                else {
                    c[b] = c[a] + cost[a][b];
                }
                tata[b] = a;
            }
        }
        hz[a] = 0;
    }
    if (tata[f] != 0) {
        return 1;
    }
    return 0;
}
int main (void) {
    in >> n;
    s = 0, f = n+n+1;
    for (int i = 1; i <= n; i ++) {
        for (int j = n+1; j <= n+n; j ++) {
            in >> cost[i][j];
            cost[j][i] = -cost[i][j];
            cap[i][j] = 1;
        }
    }
    for (int i = 1; i <= n; i ++) {
        cost[s][i] = 0;
        cap[s][i] = 1;
    }
    for (int i = n+1; i <= n+n; i ++) {
        cost[i][f] = 0;
        cap[i][f] = 1;
    }
    while (bellmanford ()) {
        int x = f, minim = 1e9,a,b;
        while (x != s) {
            b = x;
            a = tata[x];
            minim = min (cap[a][b] - flux[a][b], minim);
            x = tata[x];
        }
        x = f;
        while (x != s) {
            b = x;
            a = tata[x];
            flux[a][b] += minim;
            flux[b][a] -= minim;
            total += minim * cost[a][b];
            x = tata[x];
         }
    }
    out << total;
    return 0;
}