Cod sursa(job #437192)

Utilizator MciprianMMciprianM MciprianM Data 9 aprilie 2010 14:23:37
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 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;
bool viz[MAXN];
int n, m, from[MAXN], C[MAXN][MAXN];

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

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;
}