Cod sursa(job #1207254)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 12 iulie 2014 17:13:37
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIMN 650
#define INF 2000000000

using namespace std;

ifstream f("cc.in");
ofstream g("cc.out");

int F[DIMN][DIMN], C[DIMN][DIMN], cost[DIMN][DIMN], D[DIMN], T[DIMN];

bool viz[DIMN];

bool ok;

int n, flow, x, y, c;

vector<int> L[DIMN];

int BF () {
    queue<int> q;
    for (int i=0; i<=n; ++i)
        viz[i] = 0, D[i] = INF;
    q.push(0);
    D[0] = 0;
    while (!q.empty()) {
        int nod = q.front();
        q.pop();
        viz[nod] = 0;
        for (vector<int>::iterator it=L[nod].begin(); it!=L[nod].end(); ++it)
            if (D[*it] > D[nod] + cost[nod][*it] && C[nod][*it] - F[nod][*it] > 0) {
                D[*it] = D[nod] + cost[nod][*it];
                if (!viz[*it]) {
                    viz[*it] = 1;
                    q.push(*it);
                }
                T[*it] = nod;
            }
    }
    if (D[n] != INF) {
        ok = true;
        int Min = INF;
        for (int i=n; i!=0; i=T[i])
            Min = min(Min, C[T[i]][i] - F[T[i]][i]);
        flow += Min;
        for (int i=n; i!=0; i=T[i]) {
            F[T[i]][i] += Min;
            F[i][T[i]] -= Min;
        }
        return Min*D[n];
    }
    return 0;
}

int main () {
    f >> n;
    for (int j=1; j<=n; ++j)
        for (int i=n+1; i<=2*n; ++i) {
            f >> c;
            L[j].push_back(i);
            L[i].push_back(j);
            C[j][i] = 1;
            cost[j][i] = c;
            cost[i][j] = -c;
        }
    for (int i=1; i<=n; ++i) {
        L[0].push_back(i);
        L[i].push_back(0);
        C[0][i] = 1;
    }
    for (int i=n+1; i<=2*n; ++i) {
        L[2*n+1].push_back(i);
        L[i].push_back(2*n+1);
        C[i][2*n+1] = 1;
    }
    n = 2*n+1;
    ok = true;
    int ans = 0;
    while (ok) {
        ok = false;
        ans += BF();
    }
    g << ans << "\n";
    return 0;
}