Cod sursa(job #1209196)

Utilizator thewildnathNathan Wildenberg thewildnath Data 17 iulie 2014 12:25:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;

#define NMAX 1001
#define INF 200000000

int n,m,sol,nt;
int q[NMAX],t[NMAX],tata[NMAX],f[NMAX][NMAX];
vector<int>v[NMAX];


bool drum()
{
    int i,st=1,dr=0,nod,dest;

    nt=0;
    memset(t,0,sizeof(t));

    t[1]=1;
    q[++dr]=1;
    while(st<=dr)
    {
        nod=q[st];
        ++st;

        for(i=0;i<v[nod].size();++i)
        {
            dest=v[nod][i];

            if(f[dest][nod] && !t[dest])
            {
                if(dest==n)
                    tata[++nt]=nod;
                else
                {
                    t[dest]=nod;
                    q[++dr]=dest;
                }
            }
        }
    }
    return nt;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int i,j,maxc,x,y,c;

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        v[x].push_back(y);
        v[y].push_back(x);

        f[y][x]=c;
    }

    while(drum())
    {
        for(j=1;j<=nt;++j)
        {
            maxc=INF;

            t[n]=tata[j];
            for(i=n;i!=1;i=t[i])
                if(f[i][t[i]]<maxc)
                    maxc=f[i][t[i]];

            for(i=n;i!=1;i=t[i])
            {
                f[i][t[i]]-=maxc;
                f[t[i]][i]+=maxc;
            }

            sol+=maxc;
        }
    }

    printf("%d\n",sol);

    return 0;
}