Cod sursa(job #1513718)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 29 octombrie 2015 21:36:23
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <iostream>
#include <stack>
#include <cstring>
#include <vector>
#define pb push_back
#define nmax 1005
#define inf 0x7fffffff
#define minim(a,b) ((a)<(b)? (a):(b))
using namespace std;

int n,m1,c[nmax][nmax],f[nmax][nmax],padre[nmax],u[nmax];
vector<int> m[nmax];

int lant(int nod)
{
    //cout<<nod<<' ';
    int i;  u[nod]=1;
    if(nod==n) return 1;
    for(i=0;i<m[nod].size();i++)
        if(!u[m[nod][i]] && c[nod][m[nod][i]]>f[nod][m[nod][i]])
        {
                u[m[nod][i]]=1;
                padre[m[nod][i]]=nod;
                return lant(m[nod][i]);
        }
    return 0;
}

int main()
{
    int n1,n2,cost,i,nod,maxflow=0,newflow;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m1);
    for(;m1;m1--)
    {
        scanf("%d%d%d",&n1,&n2,&cost);
        m[n1].pb(n2); m[n2].pb(n1);
        c[n1][n2]=cost;
    }

    while(lant(1))
    {
        memset(u, 0, sizeof(u));
        nod=n;
        newflow=inf;
        while(nod!=1)
        {
            newflow=minim(newflow,c[padre[nod]][nod]-f[padre[nod]][nod]);
            nod=padre[nod];
        }
        nod=n;
        while(nod!=1)
        {
            f[padre[nod]][nod]+=newflow;
            f[nod][padre[nod]]-=newflow;
            nod=padre[nod];
        }
        maxflow+=newflow;
    }
    printf("%d\n",maxflow);
    fclose(stdin);
    fclose(stdout);
    return 0;
}