Cod sursa(job #415450)

Utilizator NemultumituMatei Ionita Nemultumitu Data 11 martie 2010 12:59:53
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int n,m,minim,f=0;
bool k=0;
vector < int > a[1020];
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;
	minim=inf;
	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 i=n;
	while (i!=1)
	{
		if (cap[pred[i]][i]<minim)
			minim=cap[pred[i]][i];
		i=pred[i];
	}
	i=n;
	while (i!=1)
	{
		cap[pred[i]][i]-=minim;
		cap[i][pred[i]]+=minim;
		i=pred[i];
	}
	f+=minim;
	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;
	}
	while (flux());
	printf("%d",f);
	return 0;
}