Cod sursa(job #2265081)

Utilizator b10nd3Oana Mancu b10nd3 Data 20 octombrie 2018 16:20:15
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include<iostream>
#include<fstream>
#include<string.h>
#include<vector>
#include<queue>

using namespace std;

#define NMAX 1005
#define INF 0X3f3f3f3f

vector <int> G[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], TT[NMAX];
bool viz[NMAX];
int n;


int bf(){
	int nodT, nodF; //F=fiu, T=tata
	vector<int> :: iterator it;
	memset(viz, 0, sizeof(int)*n);
	queue <int> q;
	q.push(1);
	
	while(!q.empty()){
		
		nodT = q.front();
		q.pop();
		if(nodT==n) continue;
		
		for(it = G[nodT].begin(); it != G[nodT].end(); it++){
			nodF = *it;
			if(viz[nodF] || C[nodT][nodF] == F[nodT][nodF] ) continue;
			TT[nodF]=nodT;
			viz[nodF]=true;
			q.push(nodF);
		}
	}
	
	return viz[n];
}


int main(){
	FILE *in=fopen("maxflow.in","r");
	FILE *out=fopen("maxflow.out","w");
	int m,i,x,y,z;
	int flow = 0, nod, fmin;
	
	fscanf(in,"%i %i",&n,&m); 
	for(i=1;i<=m;i++){
		fscanf(in,"%d %d %d",&x,&y,&z);
		C[x][y] += z;
		G[x].push_back(y);
		G[y].push_back(x); 
	}
	
	while(bf()){
	    for( i=0;i<G[n].size();i++ ){
	    
			/*
			nod = G[n][i];
	    	if( !viz[nod] || C[nod][n]==F[nod][n] ) continue;
	    	TT[n]=nod;
	    	*/
	    
			fmin = INF;
	    	for(nod=n; nod!=1; nod=TT[nod])
	    	  fmin = min( fmin, C[ TT[nod] ][nod] - F[ TT[nod] ][nod] );
		    if(fmin==0) continue;
			flow+=fmin;
			
			for(nod=n; nod!=1; nod = TT[nod] ){
			    F[ TT[nod] ][nod] += fmin;
				F[ nod ][ TT[nod] ] -= fmin;	
			} 
		}	
	}
	
	fprintf(out,"%i",flow);
	
	fclose(in); fclose(out);
	return 0; 
}