Cod sursa(job #386189)

Utilizator titusuTitus C titusu Data 24 ianuarie 2010 11:52:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
using namespace std;
#include <cstdio>
#define MAX 1005
#define INFINIT (1<<30)
int c[MAX][MAX], n, flux_maxim, 
	t[MAX], //vectorul de tati de la BFS
	p[MAX],nrp;//precedentii destiatiei

void write(){
	freopen("maxflow.out","w",stdout);
	printf("%d",flux_maxim);
}

void read(){
	int m,i,j,k;
	scanf("%d%d",&n,&m);
	for( ; m ; --m){
		scanf("%d%d%d",&i,&j,&k);
		c[i][j]=k;
		if(j==n)
			p[++nrp] = i;
	}
}

int bfs(int sursa,int destinatie){
	int coada[MAX], st=1,dr=1, k,i;
	for(i=1; i <= n ;i++)
		t[i]=-1;
	coada[1]=sursa;t[sursa]=0;
	while(st<=dr){
		k=coada[st++];
		if(k == destinatie)
			return 1; //  important :)) , altminteri ia puzderie de TLE
		for(i=1;i<=n;i++)
			if(t[i]==-1 && c[k][i]!=0){
				t[i] = k, coada[++dr] = i;
			}
	}
	return t[n]>-1;
}

void edmond_karp(){
	int i, dcur,k;
	while(bfs(1,n))
		for(i=1;i<=nrp;i++)
			if(t[p[i]]>-1 && c[p[i]][n]>0){
				dcur=INFINIT;
				t[n]=p[i];
				k=n;
				while(t[k]){
					if(c[t[k]][k]<dcur)
						dcur = c[t[k]][k];
					k = t[k];
				}
				for(k=n ; t[k] ; k = t[k])
					c[t[k]][k] -= dcur, c[k][t[k]] += dcur;
				flux_maxim += dcur;
			}
}

int main(){
	freopen("maxflow.in","r",stdin);
	read();
	edmond_karp();
	write();
	return 0;
}