Cod sursa(job #417820)

Utilizator NemultumituMatei Ionita Nemultumitu Data 14 martie 2010 21:37:51
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int n,m,minim,f=0;
vector < int > a[1020],dest;
int coada[1020],pred[1020];
int cap[1020][1020];
const int inf=1<<30;

int flux()
{
	memset(coada,0,sizeof(coada));
	memset(pred,0,sizeof(pred));
	coada[1]=1;
	int r=1,p;
	for (p=1;p<=r;++p)
	{
		for (int i=0;i<a[coada[p]].size();++i)
		{
			if (cap[coada[p]][a[coada[p]][i]]>0&&!pred[a[coada[p]][i]])
			{
				coada[++r]=a[coada[p]][i];
				pred[a[coada[p]][i]]=coada[p];
			}
		}
	}
	if (!pred[n])
		return 0;
	int aux=f;
	for (int k=0;k<dest.size();++k)
	{
		int i=dest[k];
		if (!pred[i]||!cap[i][n])
			continue;
		minim=inf;
		while (i!=1)
		{
			if (cap[pred[i]][i]<minim)
				minim=cap[pred[i]][i];
			i=pred[i];
		}
		i=dest[k];
		if (minim>cap[i][n])
			minim=cap[i][n];
		cap[i][n]-=minim;
		cap[n][i]+=minim;
		while (i!=1)
		{
			cap[pred[i]][i]-=minim;
			cap[i][pred[i]]+=minim;
			i=pred[i];
		}
		f+=minim;
	}
	if (aux==f)
		return 0;
	return 1;
}


int main()
{
	freopen ("maxflow.in","r",stdin);
	freopen ("maxflow.out","w",stdout);
	scanf("%d%d",&n,&m);
	int x,y,z;
	for (int i=1;i<=m;++i)
	{
		scanf("%d%d%d",&x,&y,&z);
		a[x].push_back(y);
		a[y].push_back(x);
		cap[x][y]=z;
		if (y==n)
			dest.push_back(x);
	}
	while (flux());
	printf("%d",f);
	return 0;
}