Cod sursa(job #623586)

Utilizator iulishorIulian Popescu iulishor Data 20 octombrie 2011 13:02:49
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
ofstream g("maxflow.out");
vector<vector<int> > mat(1001);
int f[1001][1001],cap[1001][1001],up[1001],n,m;
inline int bfs(int s, int d)
{
	int i,x,xx;
	queue<int> q;
	memset(up,-1,sizeof(up));
	q.push(s);
	up[s]=0;
	while(!q.empty())
	{
		xx=q.front();
		for(i=0;i<mat[xx].size();++i)
		{
			x=mat[xx][i];
			if(up[x]==-1 && f[xx][x]<cap[xx][x])
			{
				q.push(x);
				up[x]=xx;
				if(x==d)
					return 1;
			}
		}
		q.pop();
	}
	return 0;
}
void flux()
{
	int i,r,c=0,j;
	while(bfs(1,n))
	{
		for(i=1;i<n;++i)
			if(up[i]!=-1 && f[i][n]<cap[i][n])
			{
				r=cap[i][n]-f[i][n];
				for(j=i;j!=1 && r>0; j=up[j])
					r=min(r,cap[up[j]][j]-f[up[j]][j]);
				if(r==0)
					continue;
				f[i][n]+=r;
				f[n][i]-=r;
				for(j=i;j!=1;j=up[j])
				{
					f[up[j]][j]+=r;
					f[j][up[j]]-=r;
				}
				c+=r;
			}
	}
	g<<c;
}
int main()
{
	ifstream f("maxflow.in");
	f>>n>>m;
	int i,j;
	for(;m;--m)
	{
		f>>i>>j;
		mat[i].push_back(j);
		mat[j].push_back(i);
		f>>cap[i][j];
	}
	flux();
}