Cod sursa(job #582025)

Utilizator drywaterLazar Vlad drywater Data 14 aprilie 2011 20:02:59
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<stdio.h>
int n,m,i,c[1001][1001],f[1001][1001],x,y,co,flow,fmin,tt[1001],viz[1001],q[1001];
struct nod{int y; nod* next;};
nod *G[1001];
int add(int x,int y)
{
    nod *nou=new nod;
    nou->y=y;
    nou->next=G[x];
    G[x]=nou;
    return 0;
}
int BF()
{
    int i=1,vf;
    for (i=1;i<=n;i++) viz[i]=0;
    q[0]=q[1]=1;
    i=1;
    while (i<=q[0])
    {
        vf=q[i];
        nod *it=new nod;
        if (vf==n) {i++;continue;}
        it=G[vf];
        while (it)
        {
            if (c[vf][it->y]==f[vf][it->y] || viz[it->y]) {it=it->next; continue;}
            q[++q[0]]=it->y;
            viz[it->y]=1;
            tt[it->y]=vf;
            it=it->next;
        }
        i++;
    }
    return viz[n];
}
int main(void)
{
    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,&co);
        c[x][y]+=co;
        add(x,y);
        add(y,x);
    }
    for (flow=0;BF();)
    {
        nod *it=new nod;
        it=G[n];
        while (it)
        {
            if (!viz[it->y]) {it=it->next;continue;}
            tt[n]=it->y;
            fmin=1000000000;
            for (i=n;i!=1;i=tt[i])
            {
                if (fmin>c[tt[i]][i]-f[tt[i]][i])
                    fmin=c[tt[i]][i]-f[tt[i]][i];
            }
            if (fmin==0) {it=it->next;continue;}
            for (i=n;i!=1;i=tt[i])
            {
                f[tt[i]][i]+=fmin;
                f[i][tt[i]]-=fmin;
            }
            flow+=fmin;
            it=it->next;
        }
    }
    printf("%d\n",flow);
    return 0;
}