Cod sursa(job #296606)

Utilizator the1dragonIonita Alexandru the1dragon Data 4 aprilie 2009 22:41:48
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
#define N_MAX 1024
#define INF 0x7FFFFFFF

struct entry
{
	int val;
	entry *adr;
} *start[N_MAX];

void add(int val, int unde)
{
	entry *p=new entry;
	p->val=val;
	p->adr=NULL;
	if (start[unde]==NULL)
		start[unde]=p;
	else
	{
		p->adr=start[unde];
		start[unde]=p;
	}
}

int n, m, c[N_MAX][N_MAX], cd[N_MAX*N_MAX], best[N_MAX], last[N_MAX];
char sel[N_MAX];

inline int min(int a, int b)
{
	if (a<b) return a;
	return b;
}

int drum()
{
	int nivel=1, i;
	entry *p;
	for (i=1; i<=n; i++)
		sel[i]=best[i]=last[i]=0;
	cd[1]=1;
	best[1]=INF;
	for (i=1; i<=nivel; i++)
	{
		p=start[ cd[i] ];
		while(p)
		{
			if (best[p->val] < min(best[ cd[i] ], c[ cd[i] ][ p->val ] ))
			{
				best[p->val]=min(best[cd[i]], c[cd[i]][p->val]);
				last[p->val]=cd[i];
				if (!sel[p->val])
				{
					sel[p->val]=1;
					++nivel;
					cd[nivel]=p->val;
				}
			}
			p=p->adr;
		}
	}
   return best[n];
}


int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);

	int i, a, b, cost, nod, nod2, f, flux=0;
	scanf("%d %d", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d", &a, &b, &cost);
		c[a][b]=cost;
		add(a, b);
		add(b, a);
	}
	do
{
	f=drum();
	nod=n;
	while (last[nod])
	{
		nod2=last[nod];
		c[nod2][nod]-=f;
		c[nod][nod2]+=f;
		nod=nod2;
	}
	flux+=f;
} while(f);

	printf("%d", flux);
	fclose(stdout);
	return 0;
}