Cod sursa(job #415437)

Utilizator NemultumituMatei Ionita Nemultumitu Data 11 martie 2010 12:45:35
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int n,m,minim,f=0;
bool k=0;
vector < pair <int,int> > a[1020];
int coada[1020],marc[1020],pred[1020];
int fl[1020][1020];
const int inf=1<<30;

int flux()
{
	memset(marc,0,sizeof(marc));
	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)
		{
			int cost=a[coada[p]][i].second-fl[coada[p]][a[coada[p]][i].first];
			if (cost>0&&!marc[a[coada[p]][i].first])
			{
				marc[a[coada[p]][i].first]=1;
				coada[++r]=a[coada[p]][i].first;
				pred[a[coada[p]][i].first]=coada[p];
			}
		}
	}
	if (!pred[n])
		return 0;
	int i=n;
	while (i!=1)
	{
		int j;
		for (j=0;a[pred[i]][j].first!=i;++j);
		int cost=a[pred[i]][j].second-fl[pred[i]][i];
		if (cost<minim)
			minim=cost;
		i=pred[i];
	}
	i=n;
	while (i!=1)
	{
		fl[pred[i]][i]+=minim;
		fl[i][pred[i]]-=minim;
		i=pred[i];
	}
	f+=minim;
	return minim;
}


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(make_pair(y,z));
		a[y].push_back(make_pair(x,0));
	}
	while (flux());
	printf("%d",f);
	return 0;
}