Cod sursa(job #428809)

Utilizator vladbBogolin Vlad vladb Data 29 martie 2010 16:15:48
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
#include<vector>

#define MAX 100000

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

vector <int> v[1001];
int n,m,S,T,flow,minim;
int c[1001][1001],f[1001][1001],x[1001],t[1001],pus[1001],r[1001];


int bf()
{	int st=1,dr=1,i,nod;
	unsigned int j;
	for(i=1;i<=T;i++)
	{	t[i]=0;
		pus[i]=0;
		x[i]=0;
	}
	x[1]=S;
	pus[S]=1;
	r[S]=MAX;
	while(st<=dr)
	{	nod=x[st];
		for(j=0;j<v[x[st]].size();j++)
		{	i=v[nod][j];
			if(pus[i]==0)
			{	if(c[nod][i]!=f[nod][i])
				{	pus[i]=1;
					t[i]=nod;
					if(i==T) return 1;
					else x[++dr]=i;
				}
			}
		}
		st++;
	}
	return 0;
}

void flux()
{	while(bf())
	{	int j,i,k;
		for(j=0;j<(int)v[n].size();j++)
		{	i=v[n][j];
			if(c[i][n]!=f[i][n]&&pus[i])
			{	t[n]=i;
				minim=MAX;
				k=T;
				while(k!=S)
				{	minim=min(minim,c[t[k]][k]-f[t[k]][k]);
					k=t[k];
				}
				k=T;
				while(k!=S)
				{	f[t[k]][k]+=minim;
					f[k][t[k]]-=minim;
					k=t[k];
				}
				flow+=minim;
			}
		}
	}
}

int main()
{	int i,x,y,z;
	fin>>n>>m;
	for(i=1;i<=m;i++)
	{	fin>>x>>y>>z;
		c[x][y]=z;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	S=1;
	T=n;
	flux();
	fout<<flow;
	fin.close();
	fout.close();
	return 0;
}