Cod sursa(job #328200)

Utilizator TabaraTabara Mihai Tabara Data 1 iulie 2009 12:25:34
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
// parsare

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define in "pscnv.in"
#define out "pscnv.out"
#define NMAX 250005
#define MMAX 500005

#define ALB 0
#define GRI 1
#define NEGRU 2

#define maxim(a,b) ((a)>(b)?(a):(b))

typedef struct nod {
	int vf,cost;
	struct nod * next;
} *PNOD, NOD;

PNOD L[NMAX];

int q[NMAX*10];
int K, N, M, X, Y;
int color[NMAX];

void Add( int i, int j, int cost)
{
	PNOD p = (PNOD)calloc(  1, sizeof(NOD) );
	p->vf = j;
	p->cost = cost;
	p->next = L[i];
	L[i] = p;
}

int BF ( int max )
{
	int p, u, i;
	PNOD j;
	q[p = u = 1] = X;
	memset ( color, 0, sizeof(color) );
	while ( p <= u )
	{
		i = q[p];
		for ( j = L[i]; j; j = j->next )
			if ( color[j->vf] != NEGRU && j->cost <= max )
			{
				q[++u] = j->vf;
				color[j->vf] = GRI;
				if ( j->vf == Y ) return 1;
			}
		p++;
		color[i] = NEGRU;
	}
	return 0;
}

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

	scanf ( "%d%d%d%d", &N, &M, &X, &Y );
	
	int i, j, cost, last;
	int bl, br, bm;

	for ( ; M; --M )
	{
		scanf ( "%d%d%d", &i, &j, &cost );
		Add ( i ,j, cost );
		K = maxim ( K, cost );
	}
	
	for ( bl = 0, br = K; bl <= br; )
	{
		bm = (bl + ((br-bl)>>1));
		if ( BF(bm) ) last = bm, br = bm-1;
		else bl = bm+1;
	}
	
	printf ( "%d\n", last );
	return 0;	
}