Cod sursa(job #409699)

Utilizator xtephanFodor Stefan xtephan Data 3 martie 2010 20:11:34
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<stdio.h>
#include<queue>

using namespace std;


int n,m;
int A[1001][1001];
int viz[1001];
int tacsu[1001];
long 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]=666666666;
	
	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]>0 && !viz[i] && i!=n) { //i != destinatie
				Q.push(i);
				tacsu[i]=x;
				viz[i]=1;
				//f[i]=min(f[x],A[x][i]);
			}
		}
		
	}

}


long flux() {

	long F=0,R=0;
	int i;
	bool g=false;
	
	while(!g) {
		
		g=true;
		
		for(i=1; i<=n;i++)
			viz[i]=f[i]=0;
		
		R=0;
		bf();
		
		
		
		for(i=1; i<=n;i++) {
			if(A[i][n] && viz[i]) {
				g=false;
				/*
				R+=f[i]; 
				tacsu[n]=i;
				scade(n,f[i]);
				*/
				long R=666666666;
				long u=i;
				tacsu[n]=i;
				
				for(u=n;tacsu[u];u=tacsu[u])
					//R=min(R,A[tacsu[u]][u]);
					if(R>A[tacsu[u]][u])
						R=A[tacsu[u]][u];
					
				for(u=n;tacsu[u];u=tacsu[u]) {
					A[tacsu[u]][u]-=R;
					A[u][tacsu[u]]+=R;
				}
			F+=R;
			}
			
			
		}

	}
	
	return F;
	
}


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

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