Cod sursa(job #270176)

Utilizator mihai0110Bivol Mihai mihai0110 Data 3 martie 2009 20:01:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<vector>
#define MAXN 1024
#define CEVAMARE 10000000

using namespace std;

int x,y,i,n,m,z,minf,flow;
vector <int> a[MAXN];
int c[MAXN][MAXN],tata[MAXN];

int bfs()
{
    int i,p,u,x,ok=0;
    int Q[MAXN];
    tata[1]=1;
    memset(tata,0,sizeof(tata));
    for(p=1,u=1,Q[p]=1;p<=u;p++)
    {
        x=Q[p];
        for(i=0;i<a[x].size();i++)
            if(c[x][a[x][i]]>0 && !tata[a[x][i]])
            {
                if(a[x][i]==n)
                    return 1;
                Q[++u]=a[x][i];
                tata[a[x][i]]=x;
            }
    }
    return 0;
}


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,&z);
        c[x][y]=z;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    while(bfs())
    {
        minf=CEVAMARE;
        for(i=0;i<a[n].size();i++)
        if(tata[a[n][i]])
        {
            minf=c[a[n][i]][n];
            for(x=a[n][i];x!=1;x=tata[x])
                if(c[tata[x]][x]<minf)
                    minf=c[tata[x]][x];

            flow+=minf;

            c[a[n][i]][n]-=minf;
            c[n][a[n][i]]+=minf;
            for(x=a[n][i];x!=1;x=tata[x])
            {
                c[tata[x]][x]-=minf;
                c[x][tata[x]]+=minf;
            }
        }
    }
    printf("%d\n",flow);
    return 0;
}