Cod sursa(job #293342)

Utilizator FlorianFlorian Marcu Florian Data 1 aprilie 2009 16:53:58
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
#define MAX_N 1024
#define pb push_back
#define sz size()
#define Inf 0x3f3f3f3f
int F[MAX_N][MAX_N];
int C[MAX_N][MAX_N];
int viz[MAX_N];
int T[MAX_N];
vector <int> G[MAX_N];
int N,M;
void read()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d%d",&N,&M);
	int a,b,c;
	while(M--)
	{
		scanf("%d%d%d",&a,&b,&c);
		G[a].pb(b);
		G[b].pb(a);
		C[a][b] += c;
	}
}
int BFS()
{
	memset(viz,0,sizeof(viz));
	int nod,V,i, c[MAX_N], p=1, u=1;
	c[1] = 1;
	for(;p<=u;)
	{
		nod = c[p++];
		if(nod == N) continue;
		for(i=0;i<G[nod].sz;++i)
		{
			V = G[nod][i];
			if(viz[V] || C[nod][V] == F[nod][V]) continue;
			viz[V] = 1;
			c[++u] = V;
			T[V] = nod;
		}
	}
	return viz[N];
}
void maxflow()
{
	int fmin,i, sol=0, nod;
	for(;BFS();)
	{
		for(i=0;i<G[N].sz;++i)
		{
			nod = G[N][i];
			if(!viz[N] || C[nod][N] == F[nod][N]) continue;
			T[N] = nod;
			fmin = Inf;
			for(nod=N;nod!=1;nod=T[nod])
				fmin = min(fmin, C[ T[nod] ][nod] - F[ T[nod] ][nod]);
			if(!fmin) continue;
			for(nod=N;nod!=1;nod=T[nod])
			{
				F[T[nod]][nod] += fmin;
				F[nod][T[nod]] -= fmin;
			}
			sol+=fmin;
		}
	}
	printf("%d\n",sol);
}
int main()
{
	read();
	maxflow();
	return 0;
}