Pagini recente » Cod sursa (job #664151) | Cod sursa (job #2065310) | Cod sursa (job #1990276) | Cod sursa (job #2925876) | Cod sursa (job #37025)
Cod sursa(job #37025)
# include <stdio.h>
# include <string.h>
# define _fin "pscnv.in"
# define _fout "pscnv.out"
# define maxn 250002
# define maxm 500002
# define maxr 256
# define inf 2000000000
int *v[maxn]; // vecini
int *p[maxn]; // ponderi
int b[maxm], c[maxm], d[maxn];
int n, m, x, y, sol;
int mmin=inf, mmax;
inline void add(int u, int w, int pn)
{
v[u][++v[u][0]] = w;
p[u][ v[u][0]] = pn;
}
void readf()
{
int i, a[maxm];
char bufrow[maxr];
FILE *fin = fopen(_fin, "r");
fscanf(fin, "%d %d %d %d\n", &n, &m, &x, &y);
for(i=1; i<=m; i++)
{
fgets(bufrow, maxr, fin);
sscanf(bufrow, "%d %d %d", a+i, b+i, c+i), ++d[ a[i] ];
if ( c[i] < mmin ) mmin = c[i];
else
if ( c[i] > mmax ) mmax = c[i];
}
for(i=1; i<=n; i++)
v[i] = new int [ d[i]+1 ],
p[i] = new int [ d[i]+1 ], v[i][0] = 0;
for(i=1; i<=m; i++)
add(a[i], b[i], c[i]);
fclose(fin);
}
int bf(int k)
{
int i, ss, es, nc;
int a[maxn], d[maxn];
a[ ss=es=1 ] = x;
memset(d, 0, sizeof(d));
d[x] = 1;
while ( ss <= es )
{
nc = a[ss];
if ( nc == y ) break;
for(i=1; i<=v[nc][0]; i++)
if ( p[nc][i] <= k && !d[ v[nc][i] ] )
d[ v[nc][i] ] = 1, a[++es] = v[nc][i];
++ss;
}
return d[y];
}
void solve()
{
int i, step, vmax;
vmax = mmax-mmin;
for(step=1; step<vmax; step <<= 1);
for(i=mmax; step; step>>=1)
if ( i-step >= mmin )
if ( bf(i-step) ) i -= step;
sol = i;
}
void writef()
{
FILE *fout = fopen(_fout, "w");
fprintf(fout, "%d\n", sol), fclose(fout);
}
int main()
{
readf();
solve();
writef();
return 0;
}