Cod sursa(job #918962)

Utilizator andrettiAndretti Naiden andretti Data 19 martie 2013 11:41:37
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream>
using namespace std;

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

const int maxn=1005;
int n,m,p,u,nrd=1,flux;
int v[maxn],t[maxn],cc[maxn];
int c[maxn][maxn],f[maxn][maxn];

void cit()
{
    int i,x,y,cost;

    fin>>n>>m;

    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>cost;
        c[x][y]=cost;
    }
}

int drum()
{
    int i,nod;

    p=u=1; cc[1]=1; v[1]=nrd; t[1]=0;

    while(p<=u)
    {
        nod=cc[p];
		if(nod==n) {p++;continue;}

        for(i=1;i<=n;i++)
            if(f[nod][i]<c[nod][i] && v[i]!=nrd)
            {
                u++;
                cc[u]=i;
                t[i]=nod;
                v[i]=nrd;
            }
        p++;
    }

    return v[n];
}

void flux_max()
{
    int i,k,min;

    while(drum()==nrd)
	{
	   for(k=1;k<=n;k++)
		if(f[k][n]<c[k][n] && v[k]==nrd)
		{
			t[n]=k;
			min=999999;

			for(i=n;t[i]!=0;i=t[i])
				if(min>c[t[i]][i]-f[t[i]][i])
				   min=c[t[i]][i]-f[t[i]][i];

			for(i=n;t[i]!=0;i=t[i])
			{
				f[t[i]][i]+=min;
				f[i][t[i]]-=min;
			}

			flux+=min;
		}
		nrd++;
	}

}

int main()
{
    cit();
    flux_max();
    fout<<flux;

    fin.close();
    fout.close();
    return 0;
}