Cod sursa(job #623638)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 20 octombrie 2011 15:04:07
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb

#include <cstdio>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

#define N 1024

int fl[N][N],n,m,c[N][N],tata[N],sol;
vector<int> g[N];

void read ()
{
	ifstream in ("maxflow.in");
	in>>n>>m;
	for(int x,y,cst,i=1;i<=m;++i){
		in>>x>>y>>cst;
		c[x][y]=cst;
		g[x].push_back(y);
		}
	}

bool bf ()
{
	vector<bool> uz(n+1,0);
	queue<int> q;
	uz[1]=1;
	for(q.push(1);q.size();q.pop()){
		int nd=q.front();
		if(nd!=n)
			for(vector<int>::iterator it=g[nd].begin();it<g[nd].end();++it)
				if(!uz[*it]&&fl[nd][*it]<c[nd][*it]){
					tata[*it]=nd;
					uz[*it]=1;
					q.push(*it);
					}
		}
	return uz[n];}

void solve ()
{
	while (bf()){
		for(int i=1;i<n;++i)
			if(tata[i]&&fl[i][n]<c[i][n]){
				int mm=c[i][n]-fl[i][n];
				for(int j=i;j!=1;j=tata[j])
					if(c[tata[j]][j]-fl[tata[j]][j]<mm)
						mm=c[tata[j]][j]-fl[tata[j]][j];
				if(mm){
					fl[i][n]+=mm;
					fl[n][i]-=mm;
					for(int j=i;j!=1;j=tata[j]){
						fl[tata[j]][j]+=mm;
						fl[j][tata[j]]-=mm;
						}
					sol+=mm;
					}
				}
		}
	}

void out ()
{
	freopen ("maxflow.out","w",stdout);
	printf("%d\n",sol);
	}

int main ()
{
	read ();
	solve ();
	out ();
	return 0;}