Cod sursa(job #609846)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 23 august 2011 16:54:23
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<vector>
#define oo 99999999
#define minim(a,b) a<b?a:b
using namespace std;
vector<int>V[1010];
void read(),solve();
int C[1010][1010],a,b,c,i,n,m,flux,F[1010][1010],viz[1010],cd[1010],dad[1010],fmin,curr,BFS();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(;m;--m)
	{
		scanf("%d%d%d",&a,&b,&c);
		C[a][b]+=c;
		V[a].push_back(b);
		V[b].push_back(a);
	}
}
void solve()
{
	for(;BFS();)
		for(vector<int>::iterator it=V[n].begin();it!=V[n].end();it++)
		{
			if(F[*it][n]==C[*it][n]||!viz[*it])continue;
			fmin=oo;
			dad[n]=*it;
			for(curr=n;curr!=1;curr=dad[curr])fmin=minim(fmin,C[dad[curr]][curr]-F[dad[curr]][curr]);
			if(!fmin)continue;
			for(curr=n;curr!=1;curr=dad[curr])
			{
				F[dad[curr]][curr]+=fmin;
				F[curr][dad[curr]]-=fmin;
			}
			flux+=fmin;
		}
	printf("%d\n",flux);
}
int BFS()
{
	cd[0]=1;
	cd[1]=1;
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	for(int i=1;i<=cd[0];i++)
	{
		int curr=cd[i];
		if(curr==n)continue;
		for(vector<int>::iterator it=V[curr].begin();it!=V[curr].end();it++)
		{
			if(C[curr][*it]==F[curr][*it]||viz[*it])continue;
			viz[*it]=1;
			cd[++cd[0]]=*it;
			dad[*it]=curr;
		}
	}
	return viz[n];
}