Cod sursa(job #785938)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 10 septembrie 2012 10:41:29
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
using namespace std;
const int NMAX = 1001;
int c[NMAX][NMAX],flux[NMAX][NMAX],cd[NMAX],viz[NMAX],p[NMAX],n;
vector <int> v[NMAX];
int bfs()
{
	int nod,st,dr;
	memset(viz,0,sizeof(viz));
	cd[1]=1;
	viz[1]=1;
	st=1;
	dr=1;
	while(st<=dr) {
		nod=cd[st];
		st++;
		if (nod == n) continue;
		for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++) {
			if (c[nod][*it] == flux[nod][*it] || viz[*it]) continue;
			viz[*it]=1;
			cd[++dr]=*it;
			p[*it]=nod;
			}
	}
	return viz[n];
}
int main () 
{
	int m,i,x,y,capacity,fluxmax,fluxcurent,nod;
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");
	f>>n>>m;
	for(i=1;i<=m;i++) {
		f>>x>>y>>capacity;
		v[x].push_back(y);
		v[y].push_back(x);
		c[x][y]=capacity;
	}
	f.close();
	for(fluxmax=0 ; bfs(); ) {
		for(i=0;i<=v[n].size()-1;i++) {
			p[n]=v[n][i];
			fluxcurent=(1<<30);
			for(nod=n;nod!=1;nod=p[nod]) 
				fluxcurent=min(fluxcurent,c[p[nod]][nod]-flux[p[nod]][nod]);
			for(nod=n;nod!=1;nod=p[nod]) {
				flux[p[nod]][nod]=flux[p[nod]][nod]+fluxcurent;
				flux[nod][p[nod]]=flux[nod][p[nod]]-fluxcurent;
			}
			fluxmax=fluxmax+fluxcurent;
		}
	}
	g<<fluxmax;
	g.close();
	return 0;
}