Cod sursa(job #512515)

Utilizator proflaurianPanaete Adrian proflaurian Data 13 decembrie 2010 22:56:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<cstdio>
#include<vector>
#include<deque>
using namespace std;
vector<int> v[1001];
deque<int> Q;
int n,m,FL,D[1001],C[1001][1001],F[1001][1001],BF();
void read(),solve(),UPD();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	int X,Y,Z;
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(;m;m--)
	{
		scanf("%d%d%d",&X,&Y,&Z);
		v[X].push_back(Y);
		v[Y].push_back(X);
		C[X][Y]=Z;
	}
}
void solve()
{
	for(;BF();)UPD();
	printf("%d\n",FL);
}
int BF()   
{
	int N,i;
	vector<int>::iterator it;
	for(i=2;i<=n;i++)D[i]=0;D[1]=-1;
	Q.resize(0);Q.push_back(1);   
    for(;Q.size();)   
    {
		N=Q.front();
		for(it=v[N].begin();it!=v[N].end();it++)
		{
			if(D[*it])continue;
			if(C[N][*it]<=F[N][*it])continue;
			D[*it]=N;
			Q.push_back(*it);
			if(*it==n)return 1;   
		}   
		Q.pop_front();   
    }  
    return 0;  
}   
void UPD()   
{
	int i,j,FC;
	for(i=1;i<=n;i++)
	{
		if(!D[i])continue;
		if(C[i][n]<=F[i][n])continue;
		FC=C[i][n]-F[i][n];
		for(j=i;j!=1;j=D[j])
			FC=FC<C[D[j]][j]-F[D[j]][j]?FC:C[D[j]][j]-F[D[j]][j];
		if(!FC)continue;
		FL+=FC;
		F[i][n]+=FC;F[n][i]-=FC;
		for(j=i;j!=1;j=D[j])
		{
			F[D[j]][j]+=FC;
			F[j][D[j]]-=FC;
		}
	}
}