Cod sursa(job #880262)

Utilizator deneoAdrian Craciun deneo Data 16 februarie 2013 15:54:10
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdlib>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

#define MAXN 1100
#define INF 0x3f3f3f3f

int N, M, capacitate[MAXN][MAXN], flux[MAXN][MAXN], dad[MAXN], used[MAXN];
vector<int> graph[MAXN];

bool BFS(int nod) {
    if (nod == N)
        return 1;

    used[nod] = 1;

    for (int i = 0; i < graph[nod].size(); ++i) {
        int node = graph[nod][i];
        if (!used[node] && capacitate[nod][node] != flux[nod][node]) {
            dad[node] = nod;
            if(BFS(node))
                return 1;
        }
    }

    return 0;
}

int main() {
    fin >> N >> M;

    for (int i = 1; i <= M; ++i) {
        int x, y, c;
        fin >> x >> y >> c;
        graph[x].push_back(y); graph[y].push_back(x);
        capacitate[x][y] = c;
    }

    int maxflow = 0;

    while (BFS(1)) {
        int minim = INF;
        memset(used, 0, sizeof(used));
        for (int nod = N; nod != 1; nod = dad[nod])
            minim = min (minim, capacitate[dad[nod]][nod] - flux[dad[nod]][nod]);
        maxflow += minim;
        for (int nod = N; nod != 1; nod = dad[nod]) {
            flux[dad[nod]][nod] += minim;
            flux[nod][dad[nod]] -= minim;
        }
    }

    fout << maxflow << "\n";
    return 0;
}