Pagini recente » Cod sursa (job #2226770) | Cod sursa (job #2790530) | Cod sursa (job #81458) | Cod sursa (job #1584386) | Cod sursa (job #328200)
Cod sursa(job #328200)
// 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;
}