Cod sursa(job #387126)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 26 ianuarie 2010 21:17:42
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<cstdio>
#include<fstream>
using namespace std;
int c[1005][1005],n,flow=0,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=110001,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=110001;
                for(i=n;t[i];i=t[i])
                    if(c[t[i]][i]<cmin)
                        cmin=c[t[i]][i];
                if(cmin!=110001)
                {
                    gata=0;
                    flow+=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<<flow;
    return 0;
}