Cod sursa(job #1817706)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 28 noiembrie 2016 12:51:16
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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 t[nmax];
int flow,fmin,n,m,i;

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

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;
    df(1);
    while(viz[n])
    {
        for(auto it:v[n])
        {
            if(f[it][n]>=c[it][n] || !viz[it])
                continue;
            t[n]=it;
            fmin=inf;

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

            if(!fmin)
                continue;

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