Cod sursa(job #402562)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 23 februarie 2010 22:41:45
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
#define DIM 1005
#define INF 1<<30
int C[DIM][DIM],F[DIM][DIM],T[DIM];
int START,END,n,m;
int Flow,nod,Min;
vector <int> g[DIM];
vector <int> ::iterator it;
vector <bool> ut(DIM);
queue <int> Q;
bool BF()
{
	ut.clear(); ut.resize(n+1,0);
	for(Q.push(START),ut[START]=1;!Q.empty();Q.pop())
	{
		int nod=Q.front();
		if(nod==END)
			continue;
		for(it=g[nod].begin();it!=g[nod].end();it++)
		{
			if(C[nod][*it]<=F[nod][*it]||ut[*it])
				continue;
			ut[*it]=1;
			T[*it]=nod;
			Q.push(*it);
		}
	}
	return ut[END];
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d%d",&n,&m);
	START=1;END=n;
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		g[x].push_back(y);
		g[y].push_back(x);
		C[x][y]=z;
	}
	while(BF())
	{
		for(it=g[END].begin();it!=g[END].end();it++)
		{
			if(C[*it][END]<=F[*it][END]||!ut[*it])
				continue;
			T[END]=*it; Min=INF;
			for(nod=END;nod!=START;nod=T[nod])
				Min=min(Min,C[T[nod]][nod]-F[T[nod]][nod]);
			if(Min==0)
				continue;
			for(nod=END;nod!=START;nod=T[nod])
			{
				F[T[nod]][nod]+=Min;
				F[nod][T[nod]]-=Min;
			}
			Flow+=Min;
		}
	}
	printf("%d\n",Flow);
	return 0;
}