Cod sursa(job #1404623)

Utilizator razboi4Manole Iulian razboi4 Data 28 martie 2015 13:26:43
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 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);
    printf("lol)\n");
    queue < int > Q;
    Q.push(1);
    Dad[1] = -1;
    while(!Q.empty()) {
        int NOD = Q.front();
        Q.pop();
        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(); Max_FLOW += Min_FLOW) {
        Min_FLOW = (1 << 30);
        for(int i = N; i != 1; i = Dad[i])
            Min_FLOW = min(Min_FLOW , C[Dad[i]][i] - Flow[Dad[i]][i]);
        for(int i = N; i != 1; i = Dad[i]) {
            Flow[Dad[i]][i] += Min_FLOW;
            Flow[i][Dad[i]] -= Min_FLOW;
        }
    }
    fprintf(fopen("maxflow.out", "w"), "%d", Max_FLOW);
    return 0;
}