Cod sursa(job #1164919)

Utilizator costyv87Vlad Costin costyv87 Data 2 aprilie 2014 12:54:36
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>

#define NM 1010
#define df(i,j) (C[i][j]-F[i][j])

using namespace std;
int C[NM][NM],F[NM][NM];
vector <int> a[NM];
int i,j,n,m,st,dr;
int TT[NM],q[NM],BF[NM];

FILE *f,*g;

void read()
{
    int i,x,y,z;

    f=fopen("maxflow.in","r");
    g=fopen("maxflow.out","w");

    fscanf(f,"%d%d",&n,&m);

    st=1; dr=n;
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&x,&y,&z);
        a[x].push_back(y);
        a[y].push_back(x);
        C[x][y]=z;
    }
}

bool BFS()
{
    int i,j,x;

    for (i=1;i<=n;i++) BF[i]=0,TT[i]=-1;

    q[q[0]=1]=1;
    BF[1]=1;

    for (i=1;i<=q[0];i++)
    {
        x=q[i];
        if (x==n) break;
        for (j=0;j<a[x].size();j++)
        {
            if (BF[a[x][j]]==1 || df(x,a[x][j])==0) continue;
            TT[a[x][j]]=x;
            BF[a[x][j]]=1;
            q[++q[0]]=a[x][j];
        }
    }

    return (BF[n]==1);
}


void solve()
{
    int i,x,mn,ans=0;

    while (BFS())
    {
        for (i=1;i<=n-1;i++)
            if ( BF[i]==1 && df(i,n)!=0 )
            {
                for (mn=df(i,n),TT[n]=i,x=n;x!=1;x=TT[x])
                    mn=min(mn,df(TT[x],x));
                ans+=mn;
                if (mn>0)
                    for (x=n;x!=1;x=TT[x])
                    {
                        F[TT[x]][x]+=mn;
                        F[x][TT[x]]-=mn;
                    }
            }
    }

    fprintf(g,"%d",ans);
}


int main()
{
    read();
    solve();

    return 0;
}