Cod sursa(job #669599)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 27 ianuarie 2012 13:12:51
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;

#define minim(a,b) (a<b ? a : b)
#define INF 105
#define NMAX 10005
#define pb push_back

vector<int> g[NMAX];
vector<int> v[NMAX];
int pred[NMAX],n,nr;
int q[NMAX],h[NMAX];
char cap[5012][5012];
char flux[5012][5012];
int sum,sol,m;
char viz[NMAX];


int bfs()
{
	int i,lim,inc,sf,vec,nod;
	
	memset(pred,-1,sizeof(pred));
	memset(viz,0,sizeof(viz));
	memset(q,0,sizeof(q));
	
	q[inc=1]=0;sf=1;
	viz[0]=1;
	while(inc<=sf)
	{
		nod=q[inc];
		lim=v[nod].size();
		for(i=0;i<lim;i++)
		{
			vec=v[nod][i];
			if(!viz[vec] && flux[nod][vec]<cap[nod][vec])
			{
				viz[vec]=1;
				pred[vec]=nod;
				q[++sf]=vec;
			}
		}
		inc++;
	}
	return viz[nr-n+1];
}

void build_graph()
{
	int i,j,lim;
	for(i=1;i<=n;i++)
	{
		lim=g[i].size();
		for(j=0;j<lim;j++)
		{
		//	printf("MUchie intre %d si %d cu capacitate %d\n",i+nr-n,nr+g[i][j],cap[i][g[i][j]]);
			v[i+nr-n].pb(g[i][j]+nr);
			v[g[i][j]+nr].pb(i+nr-n);
			cap[i+nr-n][g[i][j]+nr]=cap[i][g[i][j]];
		}
		//printf("Mchie intre %d si %d cu capacitate %d\n",i+nr-n,i+nr,INF);
		v[i+nr-n].pb(i+nr);
		v[i+nr].pb(i+nr-n);
		cap[i+nr-n][i+nr]=INF;
	}
}

int main ()
{
	int i,a,b,c,val,t;

	freopen("algola.in","r",stdin);
	freopen("algola.out","w",stdout);

	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{	
		scanf("%d",&h[i]);
		sum+=h[i];
		v[0].pb(i);
		v[i].pb(0);
		cap[0][i]=h[i];
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		c=minim(c,50);
		g[a].pb(b);
		g[b].pb(a);
		cap[a][b]=c;
		cap[b][a]=c;
	}
	
	nr=n;
	for(t=1;1;t++)
	{
		build_graph();
		nr+=n;
		while(bfs())	
		{
			val=INF;
			for(i=nr-n+1;pred[i]!=-1;i=pred[i])
				val=minim(val,cap[pred[i]][i]-flux[pred[i]][i]);
			sol+=val;
			for(i=nr-n+1;pred[i]!=-1;i=pred[i])
			{
				flux[pred[i]][i]+=val;
				flux[i][pred[i]]-=val;
			}
		}	
		if(sol==sum)
		{
			printf("%d\n",t);
			break;
		}
	}
	return 0;
}