Cod sursa(job #757671)

Utilizator BitOneSAlexandru BitOne Data 12 iunie 2012 22:05:47
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <queue>
#include <vector>
#include <fstream>
#include <cstdlib>

using namespace std;

const int oo=1<<29;
const int N_MAX=1011;


queue<int> Q;
vector<int> G[N_MAX];
vector<int>::const_iterator it, iend;
int C[N_MAX][N_MAX], F[N_MAX][N_MAX];
int f[N_MAX];

inline int _min(int x, int y) {return x <= y? x : y;}
bool findPath(int start, int N)
{
    int x;

    fill(f+1, f+N+1, -1);
    f[start]=-2;
    for(Q.push(start); !Q.empty(); Q.pop())
    {
        x=Q.front();
        if(x == N)
            continue;
        for(it=G[x].begin(), iend=G[x].end(); it < iend; ++it)
            if(-1 == f[*it] && C[x][*it] > F[x][*it])
            {
                f[*it]=x;
                Q.push(*it);
            }
    }
    return -1 != f[N];
}
int main()
{
    int N, M, x, y, cMin, s=0;
    ifstream in("maxflow.in");
    ofstream out("maxflow.out");

    for(in>>N>>M; M; --M)
    {
        in>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
        in>>C[x][y];
    }
    while(findPath(1, N))
    {
        for(it=G[N].begin(), iend=G[N].end(); it < iend; ++it)
            if(-1 != f[*it] && C[*it][N] > F[*it][N])
            {
                f[N]=*it;
                cMin=oo;
                for(x=N; -2 != f[x]; x=f[x])
                    cMin=_min(cMin, C[f[x]][x] - F[f[x]][x]);
                for(x=N; -2 != f[x]; x=f[x])
                {
                    F[f[x]][x]+=cMin;
                    F[x][f[x]]-=cMin;
                }
                s+=cMin;
            }
    }
    out<<s<<'\n';

    return EXIT_SUCCESS;
}