Cod sursa(job #589610)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 12 mai 2011 22:04:05
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>

using namespace std;

#define Nmax 1024

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int C[Nmax][Nmax], F[Nmax][Nmax], T[Nmax], N, M, S, D, flux;
vector<int> G[Nmax];

bool BF(int S, int D) {
	queue<int> Q;
	bitset<Nmax> viz;
	int nod;
	bool ok=false;
	Q.push(S); viz[S]=1; 
	while(!Q.empty()) {
		nod=Q.front();
		for(vector<int>:: iterator it=G[nod].begin(); it!=G[nod].end(); ++it)
			if(!viz[*it] && F[nod][*it]<C[nod][*it]) {
				if(*it==D) {
					ok=true;
					continue;
				}
				else {
					T[*it]=nod;
					viz[*it]=1;
					Q.push(*it);
				}
			}
		Q.pop();
	}
	return ok;
}

int main() {
	int x, y, z, nod, fmin;
	f>>N>>M; S=1; D=N;
	while(M--) {
		f>>x>>y>>z;
		C[x][y]=z;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	while(BF(S,D)) 
		for(vector<int>:: iterator it=G[D].begin(); it!=G[D].end(); ++it) {
			fmin=C[nod][D]-F[nod][D];
			for(nod=*it; nod!=S; nod=T[nod])
				fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
			if(fmin==0)
				continue;
			F[*it][D]+=fmin;
			F[D][*it]-=fmin;
			for(nod=*it; nod!=S; nod=T[nod]) {
				F[T[nod]][nod]+=fmin;
				F[nod][T[nod]]-=fmin;
			}
			flux+=fmin;
		}
	g<<flux<<"\n";
	f.close();
	g.close();
	return 0;
}