Cod sursa(job #428259)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 29 martie 2010 07:56:17
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>
#include<vector>
#define Nmax 1010
#define INF 1<<30
#define Min(a,b) a<b ? a : b
using namespace std;

int n,m,r,i,flux,T[Nmax],Q[Nmax],viz[Nmax],C[Nmax][Nmax],F[Nmax][Nmax],j,a,b,c,N,fiu;
vector <int> V[Nmax];

int bfs()
{
	int i,nod,fiu,p,u=1,N;
	
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	Q[1]=1;
	
	for(p=1;p<=u;p++)
	{
		nod=Q[p];
		if(nod==n) continue;
		
		N=V[nod].size();
		
		for(i=0;i<N;i++)
		{
			fiu=V[nod][i];
			if(!viz[fiu] && C[nod][fiu]!=F[nod][fiu])
			{
				Q[++u]=fiu;
				T[fiu]=nod;
				viz[fiu]=1;
			}
		}
	}
	return viz[n];
}

	
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		
		V[a].push_back(b);
		V[b].push_back(a);
		C[a][b]=c;
	}
	
	N=V[n].size();
	
	for(flux=0; bfs(); )
//		for(j=0;j<N;j++)
		{
//			fiu=V[n][j];
//			if(!viz[fiu] || C[fiu][n]==F[fiu][n]) continue;
			
//			T[n]=fiu;
			r=INF;
			
			for(i=n;i!=1;i=T[i])
				r=Min(r,C[T[i]][i]-F[T[i]][i]);
			
			for(i=n;i!=1;i=T[i])
			{
				F[T[i]][i]+=r;
				F[i][T[i]]-=r;
			}
			flux+=r;
		}
	printf("%d",flux);
	return 0;
}