Cod sursa(job #404278)

Utilizator BaduBadu Badu Badu Data 25 februarie 2010 23:36:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
#include<queue>
#include<vector>
#include<bitset>
#include<cstring>
#define max 1024

using namespace std;
int C[max][max];
int F[max][max];
int Father[max];
char viz[max]  ;
int N,M;

vector < int > G[max];

int min( int a, int b){ return (a<b?a:b); }

int BFS(){
	
	memset( Father, 0 , sizeof(Father) );
	memset( viz, 0, sizeof(viz)        );
	queue <int > Q;
	
	Q.push(1);
	Father[1]=0;
	viz[1]=1;
	
	while( !Q.empty() ){
		
		int x = Q.front();
		Q.pop();
		vector<int>::iterator it;
		if(x==N) return 1;
		for( it = G[x].begin(); it!=G[x].end(); it++){
			if(C[x][*it] == F[x][*it] || viz[*it] ) continue;
			    viz[*it]=1;
				Father[*it] = x;
				Q.push(*it);
		}
	}
	return 0;
}
		

				
int main(){
	
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");
	
	f>>N>>M;
	int x,y,c;
	
	while( M-- ){
		f>>x>>y>>c;
		C[x][y]=c;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	int flow=0;
	
	while( BFS() ) {
		vector<int>::iterator it;
		
		for( it=G[N].begin(); it!=G[N].end(); it++){
			
			if( C[*it][N] == F[*it][N] || !viz[*it]) continue;
			Father[N]=*it;
			
			int minim=0x3f3f3f;
			int t;
			
			for( t = N ; t!=1; t = Father[t]) minim = min( minim, C[Father[t]][t] - F[Father[t]][t] );
			if (minim==0) continue;
			for( t = N ; t!=1; t = Father[t]){ F[Father[t]][t] += minim;
											  F[t][Father[t]] -=minim;}
			
			flow+=minim;
		}
	}
	
	g<<flow;

	
	return 0;
}