Cod sursa(job #1119519)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 24 februarie 2014 18:17:16
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <limits>

const unsigned UINF=std::numeric_limits<unsigned>::max();

int main(){
	std::ifstream fin("maxflow.in");
	std::ofstream fout("maxflow.out");

	unsigned n,m; fin>>n>>m;

	std::vector< std::vector<unsigned> > F(n+1,std::vector<unsigned>(n+1));
	std::vector< std::list<unsigned> > Adj(n+1);

	for(unsigned i=0;i<m;++i){
		unsigned x,y,z;
		fin>>x>>y>>z;
		Adj[x].push_back(y);
		Adj[y].push_back(x);
		F[x][y]=z;
	}

	unsigned maxflow=0;
	bool drum_gasit=true;

	while(drum_gasit){
		drum_gasit=false;
		//urmeaza un BFS...
		std::vector<int> tata(n+1,-1);
		std::list<unsigned> bfq;

		bfq.push_back(1); tata[1]=0;
		while(!bfq.empty()){
			unsigned t=bfq.front(); bfq.pop_front();

			for(auto it=Adj[t].begin();it!=Adj[t].end();++it){
				if(*it==n){
					drum_gasit=true;
					unsigned currflux=UINF;
					tata[n]=t;
					for(unsigned i=n;i!=1;i=tata[i])
						if(F[tata[i]][i]<currflux) currflux=F[tata[i]][i];

					if(currflux)
						for(unsigned i=n;i!=1;i=tata[i]){
							F[tata[i]][i]-=currflux;
							F[i][tata[i]]+=currflux;
						}
					maxflow+=currflux;
				}
				if(tata[*it]==-1&&F[t][*it]>0){
					bfq.push_back(*it);
					tata[*it]=t;
				}

			}
		}

	}

	fout<<maxflow<<'\n';
}