Cod sursa(job #437164)

Utilizator MciprianMMciprianM MciprianM Data 9 aprilie 2010 14:04:23
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<bitset>

using namespace std;

const int MAXN = 128, inf = 2000000001;
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] = 1;
				from[*it]=q.front();
				if((*it) == n) ok = false;
			}
		}
		q.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 ];
	}
	if( pathCap == inf )	return 0;
	else return pathCap;
}

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

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;
		C[y][x] = 0;
	}
	f.close();
	flow = maxflow();
	ofstream g("maxflow.out");
	g<<flow<<'\n';
	g.close();
	return 0;
}