Cod sursa(job #799552)

Utilizator sebii_cSebastian Claici sebii_c Data 19 octombrie 2012 12:31:25
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <cstring>

#include <vector>

using namespace std;

#define MAXN 1010
#define INF (1 << 30)
#define pb push_back

vector<int> G[MAXN];
int C[MAXN][MAXN], F[MAXN][MAXN];
int from[MAXN], viz[MAXN];
int cd[MAXN];
int n, m;

int bfs()
{
    cd[0] = 1, cd[1] = 1;
    memset(viz, 0, sizeof(viz));

    for (int i = 1; i <= cd[0]; ++i) {
        int node = cd[i];
        if (node == n)
            continue;
        for (int j = 0; j < G[node].size(); ++j) {
            int where = G[node][j];
            if (C[node][where] == F[node][where] || viz[where])
                continue;
            viz[where] = 1;
            cd[++cd[0]] = where;
            from[where] = node;
        }
    }

    return viz[n];
}

int main()
{
    FILE *fin = fopen("maxflow.in", "r");
    FILE *fout = fopen("maxflow.out", "w");

    fscanf(fin, "%d %d", &n, &m);
    for (int i = 0; i < m; ++i) {
        int x, y, cost;
        fscanf(fin, "%d %d %d", &x, &y, &cost);
        G[x].pb(y); G[y].pb(x);
        C[x][y] += cost;
    }

    int flow = 0;
    while (bfs()) 
        for (int i = 0; i < G[n].size(); ++i) {
            int node = G[n][i];
            if (C[node][n] == F[node][n] || !viz[node])
                continue;
            from[n] = node;

            int fmin = INF;
            for (node = n; node != 1; node = from[node])
                fmin = min(fmin, C[from[node]][node] - F[from[node]][node]);
            if (fmin == 0)
                continue;

            for (node = n; node != 1; node = from[node]) {
                F[from[node]][node] += fmin;
                F[node][from[node]] -= fmin;
            }
            flow += fmin;
        }
    fprintf(fout, "%d\n", flow);

    return 0;
}