Cod sursa(job #1404642)

Utilizator razboi4Manole Iulian razboi4 Data 28 martie 2015 13:44:07
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<bits/stdc++.h>

#define Nmax 1002
#define IT vector < int > :: iterator

using namespace std;

int N, M, C[Nmax][Nmax], Flow[Nmax][Nmax], Dad[Nmax];
vector < int > G[Nmax];

void Read()
{
    freopen("maxflow.in", "r", stdin);
    scanf("%d%d", &N, &M);
    for( ; M; -- M) {
        int X, Y, Z;
        scanf("%d %d %d", &X, &Y, &Z);
        G[X].push_back(Y);
        G[Y].push_back(X);
        C[X][Y] += Z;
    }
}

int BFS()
{
    fill(Dad + 1, Dad + 1 + N, 0);
    queue < int > Q;
    Q.push(1);
    Dad[1] = -1;
    while(!Q.empty()) {
        int NOD = Q.front();
        Q.pop();
        if(NOD == N)
            continue;
        for(IT it = G[NOD].begin(); it != G[NOD].end(); ++ it)
            if(!Dad[*it] && C[NOD][*it] != Flow[NOD][*it]) {
                Dad[*it] = NOD;
                Q.push(*it);
            }
    }
    return Dad[N];
}

int main()
{
    Read();
    int Max_FLOW = 0, Min_FLOW;
    for( ; BFS();)
        for(IT it = G[N].begin(); it != G[N].end(); ++ it) {
            Min_FLOW = (1 << 30);
            if(!Dad[*it] || C[*it][N] == Flow[*it][N])
                continue;
            for(int i = *it; i != 1; i = Dad[i])
                Min_FLOW = min(Min_FLOW , C[Dad[i]][i] - Flow[Dad[i]][i]);
            if(Min_FLOW) {
                for(int i = *it; i != 1; i = Dad[i]) {
                Flow[Dad[i]][i] += Min_FLOW;
                Flow[i][Dad[i]] -= Min_FLOW;
                }
                Max_FLOW += Min_FLOW;
            }
        }
    fprintf(fopen("maxflow.out", "w"), "%d", Max_FLOW);
    return 0;
}