Cod sursa(job #914196)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 13 martie 2013 22:37:57
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

#define mp make_pair
#define pb push_back
#define x first
#define c second
#define MAX 5005
#define INF 100

using namespace std;

int N, M, S, D, T, sum;
vector<int> V[MAX];
vector< pair<int, int> > G[MAX];
char C[MAX][MAX], F[MAX][MAX];
bool viz[MAX];
int dad[MAX];

void citire() {
    ifstream in("algola.in");
    in>>N>>M;
    S = 0;
    for(int i = 1, A; i <= N; i++) {
        in>>A;
        sum += A;
        V[S].pb(i);
        V[i].pb(S);
        C[S][i] = A;
    }
    for(int i = 1, A, B, C; i <= M; i++) {
        in>>A>>B>>C;
        G[A].pb(mp(B, C));
        G[B].pb(mp(A, C));
    } in.close();
}

void buildGraph() {
    for(int i = 1; i <= N; i++) {
        int nod = (T - 1) * N + i;
        for(size_t j = 0; j < G[i].size(); j++) {
            int dest = T * N + G[i][j].x, cap = G[i][j].c;
            V[nod].pb(dest);
            V[dest].pb(nod);
            C[nod][dest] = cap;
        }
        V[nod].pb(nod + N);
        V[nod + N].pb(nod);
        C[nod][nod + N] = INF;
    }
}

bool bfs() {
    queue<int> Q;
    memset(viz, 0, sizeof(viz));
    Q.push(S); viz[S] = true;
    while(!Q.empty()) {
        int nod = Q.front(); Q.pop();
        for(size_t i = 0; i < V[nod].size(); i++) {
            int dest = V[nod][i];
            if(C[nod][dest] == F[nod][dest] || viz[dest] || dest > D)
                continue;
            viz[dest] = true;
            dad[dest] = nod;
            if(dest == D) return true;
            Q.push(dest);
        }
    }
    return false;
}

void flux() {
    int ans = 0;
    while(bfs()) {
        int val = INF, nod = D;
        while(nod != S) {
            val = min(val, C[dad[nod]][nod] - F[dad[nod]][nod]);
            nod = dad[nod];
        }
        nod = D;
        while(nod != S) {
            F[dad[nod]][nod] += val;
            F[nod][dad[nod]] -= val;
            nod = dad[nod];
        }
        sum -= val;
    }
}

void afisare() {
    ofstream out("algola.out"); out<<--T; out.close();
}

int main()
{
    citire();
    bool sol = false;
    S = 0;
    for(T = 1; !sol; T++) {
        buildGraph();
        D = T * N + 1;
        flux();
        if(!sum)
            sol = true;
    }
    afisare();
    return 0;
}