Cod sursa(job #316841)

Utilizator tvladTataranu Vlad tvlad Data 21 mai 2009 12:50:47
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

const int N_MAX = 1000;
const int M_MAX = 5000;
const int INF = 0x3f3f3f3f;

struct muchie { int cap, flow; };

int n,m;
vector< pair<int,int> > G[N_MAX];
vector< pair<int,int> > Gr[N_MAX];
muchie VM[M_MAX];
bool view[N_MAX];
int prev[M_MAX];
bool prevIsRev[M_MAX];

inline int getArcSpace ( pair<int,int> &k ) { return VM[k.second].cap - VM[k.second].flow; }
inline int getArcSpace ( int k ) { return VM[k].cap - VM[k].flow; }
inline int getArcFlow ( pair<int,int> &k ) { return VM[k.second].flow; }
inline int getArcFlow ( int k ) { return VM[k].flow; }

bool BF() {
	queue< pair<int,int> > Q;
	queue<bool> Qr;
	fill(view,view+n,false);
	view[0] = true;
	for (Q.push(make_pair(0,-1)), Qr.push(false); !Q.empty(); Q.pop(), Qr.pop()) {
		for (vector< pair<int,int> >::iterator next = G[Q.front().first].begin(); next != G[Q.front().first].end(); ++next) {
			if (!view[next->first] && getArcSpace(*next) > 0) {
				view[next->first] = true;
				prev[next->second] = Q.front().second;
				prevIsRev[next->second] = Qr.front();
				Q.push(*next);
				Qr.push(false);
			}
		}
		for (vector< pair<int,int> >::iterator next = Gr[Q.front().first].begin(); next != Gr[Q.front().first].end(); ++next) {
			if (!view[next->first] && getArcFlow(*next) > 0) {
				view[next->first] = true;
				prev[next->second] = Q.front().second;
				prevIsRev[next->second] = Qr.front();
				Q.push(*next);
				Qr.push(true);
			}
		}
	}
	return view[n-1];
}

int maxFlow() {
	int flow = 0;
	while (BF()) {
		for (vector< pair<int,int> >::iterator nod = Gr[n-1].begin(); nod != Gr[n-1].end(); ++nod) {
			if (view[nod->first] && getArcSpace(*nod) > 0) {
				int push = INF;
				bool rev = false;
				for (int i = nod->second; i >= 0; i = prev[i], rev = prevIsRev[i])
					if (rev) {
						if (push > getArcFlow(i))
							push = getArcFlow(i);
					} else {
						if (push > getArcSpace(i))
							push = getArcSpace(i);
					}
				flow += push;
				rev = false;
				for (int i = nod->second; i >= 0; i = prev[i], rev = prevIsRev[i])
					if (rev)
						VM[i].flow -= push; else
						VM[i].flow += push;
			}
		}
	}
	return flow;
}

int main() {
	freopen("maxflow.in","rt",stdin);
	freopen("maxflow.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0, a,b,c; i < m; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		--a; --b;
		G[a].push_back(make_pair(b,i));
		Gr[b].push_back(make_pair(a,i));
		VM[i].cap = c;
		VM[i].flow = 0;
	}
	printf("%d\n",maxFlow());
	return 0;
}