Cod sursa(job #1131182)

Utilizator costyv87Vlad Costin costyv87 Data 28 februarie 2014 18:18:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <vector>
#define nm 1010
#define df(n,m) (c[n][m]-fl[n][m])
using namespace std;

FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
int n,m,i,x,y,z,nd,flow,mn;
int c[nm][nm],fl[nm][nm];
vector <int> a[nm];
int q[nm],tt[nm];
bool bf[2*nm];


int bfs()
{
    int i,j,x;

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

    for (i=1;i<=n;i++)
        bf[i]=false;
    bf[1]=true;

    for (i=1;i<=q[0];i++)
    {
        x=q[i];
        if (x==n) continue;
        for (j=0;j<a[x].size();j++)
        {
            if (bf[a[x][j]] || c[x][a[x][j]]==fl[x][a[x][j]]) continue;
            tt[a[x][j]]=x;
            bf[a[x][j]]=true;
            q[++q[0]]=a[x][j];
        }
    }

    return bf[n];
}

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

    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;
    }


    for (flow=0;bfs();)
        for (i=0;i<a[n].size();i++)
        {
            nd=a[n][i];
            if (bf[nd]==false)
                continue;
            tt[n]=nd;

            for (nd=n,mn=df(tt[nd],nd);nd!=1;nd=tt[nd])
                mn=min(mn,df(tt[nd],nd));

            if (mn==0) continue;
            flow+=mn;

            for (nd=n;nd!=1;nd=tt[nd])
            {
                fl[tt[nd]][nd]+=mn;
                fl[nd][tt[nd]]-=mn;
            }
        }


    fprintf(g,"%d",flow);
    fclose(g);
    return 0;
}