Cod sursa(job #270672)

Utilizator c_e_manuEmanuel Cinca c_e_manu Data 4 martie 2009 13:03:05
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include<fstream.h>
#define N 1001


ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n,m,c[N][N],flux,d[N],k,viz[N],q[N],t[N];

void read()
{       int i,x,y,ct;
        fin>>n>>m;
        for(i=1;i<=m;i++)
        {       fin>>x>>y>>ct;
                c[x][y]+=ct;
        }
}

void bfs()
{       int p,u,i,j;
	for(i=1;i<=n;i++) t[i]=d[i]=q[i]=viz[i]=0;
        p=u=1;
        q[1]=viz[1]=1;
        k=0;
        while(p<=u)
        {       for(i=1;i<=n;i++)
                if(!viz[i]&&c[q[p]][i])
		{       q[++u]=i;
                        viz[i]=1;
                        t[i]=q[p];
                        if(i==n)
			{       k=1;
                                d[1]=n;
                                int x;
                                x=n;
                                while(t[x]!=0)
                                {       k++;
                                        d[k]=t[x];
                                        x=t[x];
                                }
				for(j=1;j<=k/2;j++)
                                {       int aux;
                                        aux=d[j];
                                        d[j]=d[k-j+1];
                                        d[k-j+1]=aux;
                                }
                                return;
                        }
                }
                p++;
        }
        return;
}

void fordFulkerson()
{       int i,min;
        do
        {       bfs();
                if(k>0)
                {       min=c[d[1]][d[2]];
                        for(i=2;i<k;i++)
                                if(c[d[i]][d[i+1]]<min)
                                        min=c[d[i]][d[i+1]];
                        flux+=min;
                        for(i=1;i<k;i++)
                        {       c[d[i]][d[i+1]]-=min;
                                c[d[i+1]][d[i]]+=min;
                        }
                }
        }
        while(k);
}
int main()
{       read();
        fordFulkerson();
        fout<<flux<<'\n';
        return 0;
}