Cod sursa(job #544710)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 1 martie 2011 23:25:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <vector>

using namespace std;

int c[1024][1024],f[1024][1024],v[1024],q[1024],p[1024],n,m,sol;
vector <int> g[1024];

int bfs()
{
    int i,j,a,b;
    for (i=2;i<=n;++i) v[i]=0;
    v[1]=1;q[0]=1;q[1]=1;
    for (i=1;i<=q[0];++i)
    {
        a=q[i];
        if (a!=n)
            for (j=0;j<g[a].size();++j)
            {
                b=g[a][j];
                if ((c[a][b]>f[a][b])&&(!v[b]))
                {
                    ++q[0];
                    q[q[0]]=b;
                    p[b]=a;
                    v[b]=1;
                }
            }
    }
    return v[n];
}

int main()
{
    int i,a,x,y,z,t;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        g[x].push_back(y);
        g[y].push_back(x);
        c[x][y]=z;
    }
    while (bfs())
        for (i=0;i<g[n].size();++i)
        {
            a=g[n][i];
            if ((c[a][n]>f[a][n])&&v[a])
            {
                p[n]=a;
                t=111111;
                for (a=n;a!=1;a=p[a])
                    t=min(t,c[p[a]][a]-f[p[a]][a]);
                a=p[n];
                for (a=n;a!=1;a=p[a])
                    {
                        f[p[a]][a]+=t;
                        f[a][p[a]]-=t;
                    }
                sol+=t;
            }
        }
    printf("%d",sol);
    return 0;
}