Cod sursa(job #254027)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 6 februarie 2009 15:51:33
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 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=0;
	memset(que,0,sizeof(que));
	que[0]=sursa;
	memset(parent,0,sizeof(parent));
	parent[sursa]=-1;
	for(; begin <= end ; ++begin)
	{
		if(que[begin]==destinatie) 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;
			parent[*it]=que[begin];
		}
	}
	return parent[destinatie]!=0;
}


void comp_flux()
{
	int min;
	flux=0;
	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;
	comp_flux();
	printf("%d\n",flux);
	return 0;
}