Cod sursa(job #726124)

Utilizator paulbotabota paul paulbota Data 27 martie 2012 00:46:48
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<vector>
#define maxn 1001
#define inf "maxflow.in"
#define outf "maxflow.out"
#define pb push_back
#define infinit 0x3f3f3f3f

using namespace std;

ifstream in(inf);
ofstream out(outf);

vector<int> g[maxn];
int c[maxn][maxn],r[maxn][maxn],v[maxn],N,M,coada[maxn];
bool viz[maxn];

void read()
{
	int x,y,z;
	in>>N>>M;
	for(int i=1;i<=M;i++)
	{
		in>>x>>y>>z;
		g[x].pb(y);
		g[y].pb(x);
		c[x][y]=z;
	}
}

int bfs()
{
	int i,j,tata,nod;	
	coada[0]=1;
	coada[1]=1;
	memset(viz,false,sizeof(viz));
	viz[1]=true;
	for(i=1;i<=coada[0];i++)
	{
		tata=coada[i];
		if(tata==N) continue;
		for(j=0;j<g[tata].size();j++)
		{
			nod=g[tata][j];
			if(c[tata][nod]==r[tata][nod] || viz[nod]) continue;
			viz[nod]=true;
			coada[++coada[0]]=nod;;
			v[nod]=tata;
		}
	}
	return viz[N];
}

int main()
{
	read();
	int flux=0,fluxmin,i,nod;
	for(;bfs();)
	{
		for(i=0;i<g[N].size();i++)
		{
			nod=g[N][i];
			if(c[nod][N]==r[nod][N] || !viz[nod]) continue;
			v[N]=nod;
			fluxmin=infinit;
			for(nod=N;nod!=1;nod=v[nod])
				fluxmin=min(fluxmin, c[v[nod]][nod]-r[v[nod]][nod]);
			if(fluxmin==0) continue;
			for(nod=N;nod!=1;nod=v[nod])
			{
				r[v[nod]][nod]+=fluxmin;
				r[nod][v[nod]]-=fluxmin;
			}
			flux+=fluxmin;
		}
	}
	out<<flux<<"\n";
	return 0;
}