Cod sursa(job #2415538)

Utilizator eduardcadarCadar Eduard eduardcadar Data 26 aprilie 2019 10:54:56
Problema Cc Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("cc.in");
ofstream g("cc.out");
#define nmax 105
#define INF 0x3f3f3f3f
int n, x, cap[nmax*2][nmax*2], cost[nmax*2][nmax*2], sursa, dest, t[nmax*2], sol = 0;
void init() {
    sursa = 0, dest = 2*n+1;
    for (int i = 1; i <= n; ++i) cap[sursa][i] = 1, cost[sursa][i] = cost[i][sursa] = 0;
    for (int i = n+1; i < dest; ++i) cap[i][dest] = 1, cost[i][dest] = cost[dest][i] = 0;
}
void bellman() {
    int d[2*nmax], ok = 1;
    memset(d,INF,sizeof(d));
    memset(t,0,sizeof(t));
    d[sursa] = 0;
    while (ok) {
        ok = 0;
        for (int i = sursa; i <= dest; ++i)
            if (d[i] != INF) for (int j = sursa; j <= dest; ++j)
                if (cap[i][j]) if (d[i] + cost[i][j] < d[j]) d[j] = d[i] + cost[i][j], t[j] = i, ok = 1;
    }
    sol += d[dest];
}
void umple() {
    for (int i = dest; i; i=t[i]) cap[t[i]][i] = 0, cap[i][t[i]] = 1;
}
bool gata() {
    for (int i = n + 1; i < dest; ++i) if (cap[i][dest]) return 1;
    return 0;
}
int main()
{
    f >> n;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j) {
            f >> x;
            cap[i][j+n] = 1, cost[i][j+n] = x, cost[j+n][i] = -x;
        }
    init();
    while (gata()) { bellman(); umple(); }
    /*for (int i = 1; i <= n; ++i) {
        for (int j = n + 1; j < dest; ++j)
            if (!cap[i][j]) { sol += cost[i][j]; break;}
    }*/
    g << sol << '\n';
    return 0;
}