Cod sursa(job #409644)

Utilizator xtephanFodor Stefan xtephan Data 3 martie 2010 19:40:13
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#include<queue>

using namespace std;


int n,m;
int A[1001][1001];
int viz[1001];
int tacsu[1001];
int f[1001];
long Flux;
queue<int> Q;


void cit();
void rez();
void afis();

int main() {
	
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	cit();
	rez();
	afis();
	
	return 0;
}

void cit() {
	scanf("%d%d",&n,&m);
	
	
	for(int i=1; i<=m;i++) {
		long x,y,z;
		scanf("%ld%ld%ld",&x,&y,&z);
		A[x][y]=z;
	}
}


void bf() {
	
	Q.push(1); //nod sursa
	viz[1]=1;
	f[1]=100;
	
	while(!Q.empty()) {
		
		int x=Q.front();
		Q.pop();
		
		for(int i=1; i<=n;i++) { //optm - 1 nod sursa mereu
			
			if(A[x][i] && !viz[i] && i!=n) { //i != destinatie
				Q.push(i);
				tacsu[i]=x;
				viz[i]=1;
				f[i]=min(f[x],A[x][i]);
			}
		}
		
	}
	
}


void scade(int i, int v) {
	
	for(int j=i; j!=1; j=tacsu[j]) {
		A[ tacsu[j] ][j]-=v;
		A[v][ tacsu[j] ] +=v;
	}
	
}

long flux() {

	long F=0,R=0;
	int i;
	
	while(1) {
		
		for(i=1; i<=n;i++)
			viz[i]=f[i]=0;
		
		R=0;
		bf();
		
		for(i=2; i<=n;i++)
			if(A[i][n]) {
				R+=f[i]; 
				tacsu[n]=i;
				scade(n,f[i]);
			}
			
		if(!R)
			return F;
		
		F+=R;
	}
	
}


void rez() {
	Flux=flux();
}

void afis() {
	printf("%ld", Flux);
}