Cod sursa(job #467816)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 30 iunie 2010 19:14:12
Problema Algola Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMAX 55
#define INF 2000000000
#define pb push_back
using namespace std;
int n,m,A[NMAX],C[NMAX][NMAX],F[NMAX][NMAX],dad[NMAX],Q[NMAX],sum,timp;
vector <int> B[NMAX];
char viz[NMAX];
void read()
{
	scanf("%d%d",&n,&m);
	int i,x,y,z;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
	A[1]=0;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		C[x][y]=z; C[y][x]=z;
		B[x].pb(y);
		B[y].pb(x);
	}
	for (i=2; i<=n; i++)
	{
		B[0].pb(i);
		B[i].pb(0);
		C[0][i]=A[i];
	}
}
int BF()
{
	Q[0]=1; Q[1]=0;
	memset(viz,0,sizeof(viz));
	viz[0]=1;
	int i,j,nod,vec;
	for (i=1; i<=Q[0]; i++)
	{
		nod=Q[i];
		for (j=0; j<B[nod].size(); j++)
		{
			vec=B[nod][j];
			if (C[nod][vec]==F[nod][vec] || viz[vec])
				continue ;
			viz[vec]=1;
			Q[++Q[0]]=vec;
			dad[vec]=nod;
			if (vec==1)
				return 1;
		}
	}
	return 0;
}
void init()
{
	int i,j;
	for (i=0; i<=n; i++)
		for (j=0; j<=n; j++)
			F[i][j]=0;
	for (i=2; i<=n; i++)
		C[0][i]=A[i];
}
void actualizare()
{
	int i;
	sum=0;
	for (i=2; i<=n; i++)
	{
		A[i]-=F[0][i];
		sum+=A[i];
	}
}
void solve()
{
	int nod,fmin;
	while (1)
	{
		timp++;
		init();
		while (BF())
		{
			fmin=INF;
			for (nod=1; nod!=0; nod=dad[nod])
				fmin=min(fmin,C[dad[nod]][nod]-F[dad[nod]][nod]);
			for (nod=1; nod!=0; nod=dad[nod])
			{
				F[dad[nod]][nod]+=fmin;
				F[nod][dad[nod]]-=fmin;
			}
		}
		actualizare();
		if (sum==0)
			break ;
	}
}
int main()
{
	freopen("algola.in","r",stdin);
	freopen("algola.out","w",stdout);
	read();
	solve();
	printf("%d\n",timp);
	return 0;
}