Cod sursa(job #417040)

Utilizator stinkyStinky si Grasa stinky Data 13 martie 2010 21:52:09
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<cstring>
#include<vector>

using namespace std;

const int N = 1<<10;
const int oo = 1<<18;

int n,S,D,c[N][N],f[N][N],pred[N],coada[N];
vector<int> a[N];

void citire()
{
	int m,x,y,z;
	scanf("%d%d",&n,&m);
	while(m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		c[x][y] = z;
		a[x].push_back(y);
		a[y].push_back(x);
	}
	S = 1;
	D = n;
}

inline int min(int x,int y)
{
	return x<y ? x : y;
}

int minim(int x)
{
	int r = oo;
	while(x != S)
	{
		r = min(r,c[pred[x]][x]-f[pred[x]][x]);
		x = pred[x];
	}
	return r;
}

void drum(int x,int r)
{
	while(x != S)
	{
		f[pred[x]][x] += r;
		f[x][pred[x]] -= r;
		x = pred[x];
	}
}

bool bf()
{
	int p,u,x,y;
	p = u = 0;
	coada[u++] = S;
	memset(pred,0,sizeof(pred));
	while(p != u)
	{
		x = coada[p++];
		for(size_t i=0 ; i<a[x].size() ; ++i)
		{
			y = a[x][i];
			if(pred[y]==0 && f[x][y] < c[x][y])
			{
				coada[u++] = y;
				pred[y] = x;
			}
		}
	}
	return (bool)pred[D];
}

int flux()
{
	int fl=0,x,r;
	while(bf())
	{
		for(size_t i=0 ; i<a[D].size() ; ++i)
		{
			x = a[D][i];
			if(pred[x] == 0 || f[x][D] >= c[x][D])
				continue;
			r = c[x][D] - f[x][D];
			r = min(r,minim(x));
			drum(x,r);
			f[x][D] += r;
			f[D][x] -= r;
			fl += r;
		}
	}
	return fl;
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	citire();
	printf("%d\n",flux());
	return 0;
}