Cod sursa(job #437211)

Utilizator MciprianMMciprianM MciprianM Data 9 aprilie 2010 14:46:15
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<bitset>

using namespace std;

const int MAXN = 1024, inf = 120000;
vector<int> G[MAXN];
queue<int> q, leaves;
bool viz[MAXN];
int n, m, from[MAXN], C[MAXN][MAXN];

int findPath(){
	vector<int> :: iterator it;
	int dad, pathCap, cap, flow = 0;
	memset(viz, 0, sizeof(viz));	memset(from, -1, sizeof(from));
	while(!q.empty())	q.pop();
	while(!leaves.empty())	leaves.pop();
	q.push(1);
	viz[1] = true;
	while(!q.empty()){
		for(it=G[q.front()].begin();it!=G[q.front()].end();++it){
			if( C[q.front()][*it] > 0 && ! viz [ *it ] ){
				if(*it!=n)	q.push(*it);
				viz[*it] = true;
				from[*it]=q.front();
				if((*it) == n){	leaves.push(q.front());viz[n]=false;}
			}
		}
		q.pop();
	}
	if ( leaves.empty() )
		return 0;
	while(!leaves.empty()){
		from[n]=leaves.front();
		leaves.pop();
		dad=n;	pathCap=inf;
		while(from[dad]!=-1){
			cap = C[from [ dad ]][ dad];
			if(cap<pathCap)
				pathCap=cap;
			dad = from [ dad ];
		}
		dad = n;
		while(from[dad]!=-1){
			C[from[dad]][dad] -= pathCap;
			C[dad][from[dad]] += pathCap;
			dad = from [ dad ];
		}
		flow += pathCap;
	}
	return flow;
}

int maxflow(){
	int  d, flow=0;
	while ( 1 ){
		d = findPath ();
		if( d == 0 )    return flow;
		else            flow = flow + d;
	}
}

int main(){
	int i, x, y, c, flow;
	ifstream f("maxflow.in");
	f>>n>>m;
	for(i=0;i<m;i++){
		f>>x>>y>>c;
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y] = c;
	}
	f.close();
	flow = maxflow();
	ofstream g("maxflow.out");
	g<<flow<<'\n';
	g.close();
	return 0;
}