Cod sursa(job #553990)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 14 martie 2011 14:32:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#include<vector>
#include<deque>
#define pb push_back
using namespace std;

int n,m,x,y,c,FL,D[1010],C[1010][1010],F[1010][1010],bfs();
vector<int> V[1010];
deque<int> Q;
void read(),solve(),upd();

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",&x,&y,&c);
		V[x].pb(y);
		V[y].pb(x);
		C[x][y]=c;
	}
}

void solve()
{
	for(;bfs();)
		upd();
	printf("%d\n",FL);
}

int bfs()
{
	vector<int>::iterator it;
	int N,i;
	for(i=1;i<=n;i++)D[i]=0;D[1]=-1;
	Q.resize(0);Q.pb(1);
	for(;Q.size();Q.pop_front())
	{
		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;
			Q.pb(*it);
			D[*it]=N;
			if(*it==n)return 1;
		}
	}
	return 0;
}

void upd()
{
	int FC;
	for(int 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(int 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(int j=i;j!=1;j=D[j])
		{
			F[j][D[j]]-=FC;
			F[D[j]][j]+=FC;
		}
	}
}