Cod sursa(job #254001)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 6 februarie 2009 14:52:28
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<stdio.h>
#include<vector>
using namespace std;

const int N=1002;
vector < int > dest[N];
vector < int >::iterator it;
int flx[N][N],flux;
int cap[N][N];
int sursa, destinatie;
int parent[N];
int que[N],begin,end,nod;
int n;

bool bfs()
{
	begin=0; end=1;
	que[0]=sursa;
	memset(parent,0,sizeof(parent));
	while(begin<end)
	{
		if(que[begin]==N){ ++begin; continue; }
		for(it=dest[que[begin]].begin();it!=dest[que[begin]].end();++it)
		{
			if(parent[*it] || flx[que[begin]][*it]==cap[que[begin]][*it]) continue;
			que[end]=*it;
			++end;
			parent[*it]=que[begin];
		}
		++begin;
	}
	return parent[destinatie];
}


void comp_flux()
{
	int min;
	while(bfs())
	{
		for(it=dest[destinatie].begin();it!=dest[destinatie].end();++it)
		{
			if(!parent[*it]||cap[*it][destinatie]==flx[*it][destinatie])
				continue;
			min = 0x3f3f3f3f;
			parent[destinatie]=*it;
			for(nod=destinatie;nod!=sursa;nod=parent[nod])
				if(cap[parent[nod]][nod]-flx[parent[nod]][nod]<min)
					min=cap[parent[nod]][nod]-flx[parent[nod]][nod];
			for(nod=destinatie;nod!=sursa;nod=parent[nod])
			{
				flx[parent[nod]][nod]+=min;
				flx[nod][parent[nod]]-=min;
			}
			flux+=min;
		}
	}
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	int m;
	int i;
	int v1,v2,k;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;++i)
	{
		scanf("%d%d%d",&v1,&v2,&k);
		dest[v1].push_back(v2);
		dest[v2].push_back(v1);
		cap[v1][v2]=k;
	}
	sursa=1;
	destinatie=n;
	flux=0;
	comp_flux();
	printf("%d\n",flux);
	return 0;
}