Cod sursa(job #591523)

Utilizator unknownliviuMaria Liviu Valentin unknownliviu Data 24 mai 2011 17:50:37
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");

const int N=1010;
int flux[N][N],n,m,pred[N],cap[N][N];
vector<int>a[N];
bool viz[N];
queue<int>coada;

void f()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			out<<flux[i][j]<<"\t ";
		out<<"\n";
	}
	out<<"\n";
}

void read()
{
	int x,y,z;
	in>>n>>m;
	for(int i=1;i<=m;i++)
	{
		in>>x>>y>>z;
		cap[x][y]=z;
		a[x].push_back(y);
	}
}

void reset()
{
	for(int i=0;i<=n;i++)
		viz[i]=0,pred[i]=0;
}

bool bfs()
{
	int x=1,y,p=1,u=0,v[N];
	v[++u]=1;
	
	viz[1]=1;
	
	while(p<=u)
	{
		x=v[p++];
		
		for(int i=0;i<a[x].size();i++)
		{
			y=a[x][i];
			if(flux[x][y]<cap[x][y] && !viz[y])
			{
				viz[y]=1;
				v[++u]=y;
				pred[y]=x;
				if(y==n)
					return true;
			}
		}
	}
	
	return false;
}

inline int min(int w,int e)
{
	return w<e?w:e;
}

void solve()
{
	int i=n,minim,sol=0,d=N*N*N;
	while(bfs())
	{
		i=n,minim=d;
		while(pred[i])
		{
			//out<<i<<"<-"<<pred[i]<<"<-";
			minim=min(minim, (cap[pred[i]][i]-flux[pred[i]][i]) );
			i=pred[i];
		}
		//out<<"\n";
		sol+=minim;
		i=n;
		
		while(pred[i])
		{
			flux[pred[i]][i]+=minim;
			flux[i][pred[i]]-=minim;
			i = pred[i];
		}
		reset();
	}
	out<<sol;
}
int main()
{
	read();
	solve();
	return 0;
}