Cod sursa(job #1383738)

Utilizator crisovidiuCristian Ovi crisovidiu Data 10 martie 2015 16:28:56
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
//#include <iostream>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <bitset>
#include <limits>
#include <fstream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

#define nmax 1010
#define mod 1000007
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define inf numeric_limits<int>::max()
#define forv(v,it) for (vector<int>::iterator it=v.begin();it!=v.end();it++)

int n,m,x,y,cap,viz[nmax],t[nmax],q[10*nmax],c[nmax][nmax],f[nmax][nmax],flmin,flow;
vector<int> g[nmax];

int bfs()
{
    int i,j,nod,vecin;
    q[0]=q[1]=1;
    for (i=1;i<=q[0];i++)
    {
        nod=q[i];
        if (vecin==n)
            continue;
        forv(g[nod],it)
        {
            vecin=*it;
            if (c[nod][vecin]==f[nod][vecin] || viz[vecin])
                continue;
            viz[vecin]=1;
            t[vecin]=nod;
            q[++q[0]]=vecin;
        }
    }
    return viz[n];
}

int main()
{
    int i,j,nod,vecin;
    cin>>n>>m;
    for (i=1;i<=m;i++)
    {
        cin>>x>>y>>cap;
        g[x].pb(y);
        g[y].pb(x);
        c[x][y]=cap;
    }
    while (bfs())
    {
        forv(g[n],it)
        {
            vecin=*it;
            if (c[vecin][n]==f[vecin][n] || !viz[vecin])
                continue;
            t[n]=vecin;
            flmin=inf;
            for (nod=n;nod!=1;nod=t[nod])
                flmin=min(flmin,c[t[nod]][nod]-f[t[nod]][nod]);
            if (!flmin)
                continue;
            for (nod=n;nod!=1;nod=t[nod])
            {
                f[t[nod]][nod]+=flmin;
                f[nod][t[nod]]-=flmin;
            }
            flow+=flmin;
        }
        for (i=1;i<=n;i++)
            viz[i]=0;
    }
    cout<<flow;
}