Cod sursa(job #573377)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 6 aprilie 2011 10:58:09
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
#include<iostream>
#include<vector>

using namespace std;

int n,sol,sw[1005],C[1000000],t[1005],flux[1005][1006],cap[1006][1006];

vector <int > v[1005];

int maxflux()
{
	vector<int >:: iterator it;
	int s,i,fmax,p,u,k;
	p=u=1;
	C[1]=1;
	memset(sw,0,sizeof(sw));
	sw[1]=1;
	
	while(p<=u)
	{
		for (it=v[C[p]].begin();it<v[C[p]].end();++it)
			if (sw[*it]==0 && cap[C[p]][*it]>flux[C[p]][*it] && *it!=n)
			{
				sw[*it]=1;
				t[*it]=C[p];
				C[++u]=*it;
			}
		++p;
	}
	
	s=0;
	for (i=1;i<n;i++)
		if (cap[i][n]>flux[i][n])
		{
			fmax=cap[i][n]-flux[i][n];
			for (k=i;k>1;k=t[k])
				fmax=min(fmax,cap[t[k]][k]-flux[t[k]][k]);
			flux[i][n]+=fmax;
			for (k=i;k>1;k=t[k])
			{
				flux[t[k]][k]+=fmax;
				flux[k][t[k]]-=fmax;
			}
			s+=fmax;
		}
	return s;
}

void flow()
{
	int i;
	i=1;sol=0;
	while(i!=sol)
	{
		i=sol;
		sol+=maxflux();
	}
}

void afisare()
{
	ofstream g("maxflow.out");
	g<<sol;
	g.close();
}

void citire()
{
	int i,m,x,y,c;
	
	ifstream f("maxflow.in");
	f>>n>>m;
	
	for (i=1;i<=m;i++)
	{
		f>>x>>y>>c;
		cap[x][y]=c;
		v[x].push_back(y);
	}
	f.close();
}

int main()
{
	citire();
	flow();
	afisare();
	return 0;
}