Cod sursa(job #328229)

Utilizator TabaraTabara Mihai Tabara Data 1 iulie 2009 12:59:59
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 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];
char buffer[10000000];

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", &N, &M, &X, &Y );
	
	int i, j, cost, last = 0;
	//int bl, br, bm;
	
	fread ( buffer, sizeof(char), 10000000, stdin );
	char sep[] = " \n";
	char *p;
	
	p = strtok ( buffer, sep );
	i = atoi ( p );
	p = strtok ( 0, sep );
	j = atoi ( p );
	p = strtok ( 0, sep );
	cost = atoi ( p );
	Add ( i, j, cost );

	M--;

	for ( ; M; --M )
	{
		p = strtok ( 0, sep );
		i = atoi ( p );
		p = strtok ( 0, sep );
		j = atoi ( p );
		p = strtok ( 0, sep );
		cost = atoi ( p );

		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;
	}
*/
	int step;
	for ( step = 1; step <= K; step <<= 1 );
	for ( i = 0; step; step >>= 1 )
	{
		if ( i + step <= K && !BF( i + step ) ) i += step;
	}

	last = i + 1;

	printf ( "%d\n", last );
	return 0;	
}