Cod sursa(job #339801)

Utilizator razvi9Jurca Razvan razvi9 Data 11 august 2009 17:10:49
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<vector>

#define MIN(a,b) (a)<(b)?(a):(b)

int n,m,i,j,C[1001][1001],F[1001][1001],t[1001],flow,min;
std::vector<int> a[1001];
int q[1001],st,dr;

int BF()
{
	memset(t,0,sizeof(t));
	st = dr = 1;
	q[1] = 1;
	int i,x;
	t[1] = -1;
	while(st<=dr)
	{
		x = q[st];
		for(i = 0;i<a[x].size();++i)
			if(!t[a[x][i]] && C[x][a[x][i]] != F[x][a[x][i]])
			{
				q[++dr] = a[x][i];
				t[a[x][i]] = x;
			}
		++st;
	}
	return t[n];
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int x,y,z;m;--m)
	{
		scanf("%d %d %d",&x,&y,&z);
		a[x].push_back(y);
		a[y].push_back(x);
		C[x][y] += z;
	}
	for(;BF();)
	{
		for(i=1;i<n;++i)
			if(t[i] && C[i][n] != F[i][n])
			{
				min = C[i][n] - F[i][n];
				j = i;
				while(j!=1 && min)
				{
					min = MIN(min,C[t[j]][j] - F[t[j]][j]);
					j = t[j];
				}
				if(min)
				{
					flow += min;
					F[i][n] += min;
					F[n][i] -= min;
					j=i;
					while(j!=1)
					{
						F[t[j]][j] += min;
						F[j][t[j]] -= min;
						j = t[j];
					}
				}
			}
	}
	printf("%d",flow);
	fclose(stdout);
	return 0;
}