Cod sursa(job #309844)

Utilizator marinMari n marin Data 1 mai 2009 12:15:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#include <list>
#define DIM 1002
#define INF 5000*110001

using namespace std;

list<int> L[DIM];
int C[DIM][DIM];
int F[DIM][DIM];
int T[DIM];
int V[DIM];
int Q[DIM*DIM];

int n,m,x,y,c,i,flux,fr,t,minim;

int BF() {
	int p,u,nod,vec,ok;
	list<int>::iterator it;
	
	memset(V,0,sizeof(V));
	p = 1;u = 1;
	Q[p] = 1; V[1]=1;
	ok = 0;
	while (p<=u) {
		nod = Q[p];
		for (it = L[nod].begin(); it!=L[nod].end(); it++) {
			vec = *it;
			if (V[vec]==0 && C[nod][vec]>F[nod][vec]) {
				if (vec == n) {
					ok = 1;
					continue;
				}
				u++;
				Q[u] = vec;
				V[vec] = 1;
				T[vec] = nod;
			}
		}
		p++;
	}
	
	
	return ok;
}


int main(){
	FILE *f = fopen("maxflow.in","r");
	fscanf(f,"%d%d",&n,&m);
	for (i=1;i<=m;i++) {
		fscanf(f,"%d%d%d",&x,&y,&c);
		C[x][y] = c;
		L[x].push_back(y);
		L[y].push_back(x);
	}
	fclose(f);
	
	list<int>::iterator it;
	flux = 0;
	while (BF()) {
		for (it = L[n].begin(); it!=L[n].end(); it++) {
			fr = *it;
			if (!V[fr] || C[fr][n] == F[fr][n]){
				continue;
			}
			
			T[n] = fr;
			for (minim = INF, t = n; T[t]; t = T[t]) {
				if (minim>C[T[t]][t] - F[T[t]][t])
					minim = C[T[t]][t] - F[T[t]][t];
			}
			
			for (t = n; T[t]; t = T[t]) {
				F[T[t]][t]+=minim;
				F[t][T[t]]-=minim;
			}
			if (minim!=INF) {
				flux+=minim;
			}
		}
	}
	
	FILE *g = fopen("maxflow.out","w");
	fprintf(g,"%d",flux);
	fclose(g);
	
	return 0;
}