Cod sursa(job #929294)

Utilizator taigi100Cazacu Robert taigi100 Data 26 martie 2013 22:42:26
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;

#define max 1024
#define inf 0x3f3f3f3f
#define mins(a,b) ((a)<(b) ?  (a):(b))
int val[max][max];
int f[max][max];
int r[max],n,m;
int cd[max],viz[max];
vector<int> roads[max];

int BFS()
{
	int i,j,nod,v;

	cd[0]=cd[1]=1;
	memset(viz,0,sizeof(viz));
	viz[1]=1;

	for( i=1;i<= cd[0]; i++)
	{
		nod=cd[i];
		   if( nod == n) continue;
			   for(j=0;j < roads[nod].size();j++)
			   {
				   v=roads[nod][j];
				   if(val[nod][v] == f[nod][v] || viz[v]) continue;
					   viz[v]=1;
				   cd[++cd[0]]=v;
				   r[v]=nod;
			   }
	}
	return viz[n];
}

int main()
{

	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);

	scanf("%d %d",&n,&m);
	int i,nod,flow,min,a,b,c;

	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		val[a][b]+=c;
		roads[a].push_back(b);
		roads[b].push_back(a);
	}

	for(flow=0;BFS();)
		for(i=0;i<roads[n].size();i++)
		{
			nod=roads[n][i];
			if( f[nod][n] == val[nod][n] || !viz[nod] ) continue;
			r[n]=nod;
			min=inf;
			for(nod=n;nod!=1;nod=r[nod])
				min=mins(min,val[r[nod]][nod] - f[r[nod]][nod]);
			if(min==0)
				continue;
			for(nod=n;nod!=1;nod=r[nod])
			{
				f[r[nod]][nod]+=min;
				f[nod][r[nod]]-=min;
			}
			flow+=min;
		}
	printf("%d",flow);
	return 0;

}