Cod sursa(job #371559)

Utilizator titusuTitus C titusu Data 5 decembrie 2009 19:53:24
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
using namespace std;
#include <cstdio>
#define MAX 1005
#define INFINIT 1<<30
int cap[MAX][MAX], //capacitatile
	n , //numarul de arce
	tata[MAX], //vectorul de tati de la bfs
	predest[MAX], nrPrecD; // precedentii destinatiei

void read(){
	freopen("maxflow.in","r",stdin);
	int m,i,j,c;
	scanf("%d%d", &n , &m);
	for( ; m ; --m){
		scanf("%d%d%d", &i,&j,&c);
		cap[i][j]=c;
		if(j==n)
			predest[++nrPrecD]=i;
	}
}

int bfs(int sursa, int dest){
	int coada[MAX], st=1,dr=1,k,i;
	for(i=1;i<=n;++i)
		tata[i] = -1;
	tata[sursa]=0;
	coada[1]=sursa;
	while(st<=dr){
		k = coada[st];
		if(k==dest)
			return 1;
		for(i=1;i<=n;i++)
			if(tata[i]==-1 && cap[k][i]){
				coada[++dr] = i;
				tata[i] = k;
			}
		st++;
	}
	return 0;
}

int main(){
	read();
	int fluxMaxim=0,fmin, k, v;
	while(bfs(1,n))
		for(int i=1;i<=nrPrecD;++i){
			k = predest[i];
			tata[n] = k;
			v=n;
			fmin=INFINIT;
			while(k=tata[v]){
				if(cap[k][v]<fmin)
					fmin=cap[k][v];
				v = k;
			}
			fluxMaxim += fmin;
			v = n;
			while(k = tata[v]){
				cap[k][v] -= fmin;
				cap[v][k] += fmin;
				v = k;
			}
		}
	freopen("maxflow.out","w",stdout);
	printf("%d\n", fluxMaxim);
	return 0;
	
}