Cod sursa(job #387244)

Utilizator bora_marianBora marian bora_marian Data 27 ianuarie 2010 09:43:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<cstdio>
#include<fstream>
using namespace std;
int c[1005][1005],n,maxflow,t[1005],v[1005],nv=0;

void citire()
{
    int m,x,y,z;
    ifstream fin("maxflow.in");
    fin>>n>>m;
    for(;m;m--)
    {
        fin>>x>>y>>z;
        c[x][y]=z;
        if(y==n)
            v[++nv]=x;
    }
}

void bfs(int s,int d)
{
    int coada[1005],st,dr,k,i;
    st=dr=1;
    for(i=1;i<=n;i++)
        t[i]=-1;
    coada[st]=s;
    t[s]=0;
    while(st<=dr)
    {
        k=coada[st++];
        if(k==d)
            return;
        for(i=2;i<=n;i++)
            if(t[i]==-1 && c[k][i]>0)
            {
                coada[++dr]=i;
                t[i]=k;
            }
    }
}

void ek()
{
    int cmin=200001,gata=0,i,j;
    while(!gata)
    {
        gata=1;
        bfs(1,n);
        for(j=1;j<=nv;j++)
            if(t[v[j]]!=-1 && c[v[j]][n]>0)
            {
                t[n]=v[j];
                cmin=200001;
                for(i=n;t[i];i=t[i])
                    if(c[t[i]][i]<cmin)
                        cmin=c[t[i]][i];
                if(cmin!=200001)
                {
                    gata=0;
                    maxflow+=cmin;
                    for(i=n;t[i];i=t[i])
                    {
                        c[t[i]][i]-=cmin;
                        c[i][t[i]]+=cmin;
                    }
                }
            }
    }
}

int main()
{
    citire();
    ek();
    ofstream fout("maxflow.out");
    fout<<maxflow;
    return 0;
}