Cod sursa(job #279865)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 13 martie 2009 01:43:55
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
#define INF 1000000
#define N 1001

using namespace std;

int c[N][N], flux, d[N], f[N][N], t[N], b[N], n, m, x, y, cost;

void edmondsKarp();
int bf();


int main()
{
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");

	f>>n>>m;
	
	for(int i = 1; i <= m; i++)
    {
            f>>x>>y>>cost;
            c[x][y] = cost;
    }
	
	edmondsKarp();
	
	g<<flux;

	return 0;
}


void edmondsKarp()
{
	int min,i,j;

	do{

		min = bf();
		if(min > 0)
		{
			flux+=min;
			i = n;
			while(i!=1)
			{
				j = t[i];
				f[j][i] += min;
				f[i][j] -= min;
				i = j;
			}

		}
	}
	while(min !=0);
}

int bf()
{
	int coada[N],prim=1, ultim=1, nod_cur,i;

	for(i = 1; i <= n; i++)
	      t[i] = coada[i] = d[i] = 0;

	d[1] = INF;
	coada[prim] = 1;

	while(prim <= ultim)
	{
		nod_cur = coada[prim];

		for(i=1;i<=n;i++)
			if(t[i]== 0 && c[nod_cur][i] - f[nod_cur][i] > 0)
			{
				coada[++ultim] = i;
				t[i] = nod_cur;
				if(d[nod_cur] < c[nod_cur][i] - f[nod_cur][i])
					d[i] = d[nod_cur];
				else
					d[i] = c[nod_cur][i] - f[nod_cur][i];
				if(i == n)
					return d[n];
			}
		prim++;
	}
	return 0;
}