Cod sursa(job #505116)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 30 noiembrie 2010 20:02:30
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
using namespace std;
#include<stdio.h>
#include<vector>
const int N=1<<10;
const int INF = 1<<17;

int n,m;
vector <int> a[N];
int c[N][N],f[N][N],pred[N],coada[N];
bool viz[N];

void citire()
{
	int x,y,z;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		scanf("%d%d%d",&x,&y,&z);
		a[x].push_back(y);
		c[x][y] = z;
	}
}

bool bfs()
{
	int u=0,p=0,x,y,i;
	coada[u]=1;
	for(i=1;i<=n;++i)
		viz[i]=false;
	viz[1]=true;
	while(p<=u)
	{
		x = coada[p++];
		for(i=0 ; i<a[x].size() ; ++i)
		{
			y = a[x][i];
			if(!viz[y] && f[x][y]<c[x][y])
			{
				pred[y] = x;
				coada[++u] = y;
				viz[y] = true;
				if(y==n)
					return true;
			}
		}
	}
	return false;
}

int FF()
{
	int min,sursa=1,dest=n,x,rez=0;
	while(bfs())
	{
		min = INF;
		for(x=dest;x!=sursa;x=pred[x])
			if(min>c[pred[x]][x]-f[pred[x]][x])
				min=c[pred[x]][x]-f[pred[x]][x];
		for(x=dest;x!=sursa;x=pred[x])
		{
			f[pred[x]][x]+=min;
			f[x][pred[x]]-=min;
		}
		rez+=min;
	}
	return rez;
}

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