Cod sursa(job #1817693)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 28 noiembrie 2016 12:38:13
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

#define nmax 1010

const int inf = 1e9;

vector <int> v[nmax];
int c[nmax][nmax];
int f[nmax][nmax];
int viz[nmax];
int son[nmax];
int flow,fmin,n,m,i;

bool df(int x)
{
    for(auto it:v[x])
    {
        if(f[x][it]>=c[x][it] || viz[it])
            continue;
        viz[it]=1;
        son[x]=it;
        if(it==n || df(it))
            return 1;
    }
    return 0;
}

int main()
{
    fin>>n>>m;
    for(i=1; i<=m; ++i)
    {
        int a,b,z;
        fin>>a>>b>>z;
        v[a].push_back(b);
        v[b].push_back(a);
        c[a][b]+=z;
    }
    viz[1]=1;
    while(df(1))
    {
        for(auto it:v[n])
        {
            if(f[it][n]>=c[it][n] || !viz[it])
                continue;
            son[it]=n;
            fmin=inf;

            for(i=1; i<n; i=son[i])
                fmin=min(fmin,c[i][son[i]]-f[i][son[i]]);

            if(!fmin)
                continue;

            for(i=1; i<n; i=son[i])
            {
                f[i][son[i]]+=fmin;
                f[son[i]][i]-=fmin;
            }
            flow+=fmin;
        }
        for(int i=2; i<=n; ++i)
            viz[i]=0;
    }
    fout<<flow;
}