Pagini recente » Cod sursa (job #2325431) | Cod sursa (job #1796998) | Cod sursa (job #2831068) | Cod sursa (job #1654032) | Cod sursa (job #32838)
Cod sursa(job #32838)
using namespace std;
#include <cstdio>
#include <string>
#define FIN "pscnv.in"
#define FOUT "pscnv.out"
#define NMAX 250001
#define INF 0x3f3f3f3f
int N, M, dimheap, *lv[NMAX], *cost[NMAX], gr[NMAX];
int h[NMAX], ind[NMAX], dist[NMAX], t, s, a, b, c;
char sir[50];
void get ()
{
int l = strlen (sir), i = l - 1, ct = 1;
a = b = c = 0;
while (sir[i] != ' ')
{
c += (sir[i] - 48) * ct;
ct *= 10;
-- i;
}
-- i;
ct = 1;
while (sir[i] != ' ')
{
b += (sir[i] - 48) * ct;
ct *= 10;
-- i;
}
-- i;
ct = 1;
while (i >= 0)
{
a += (sir[i] - 48) * ct;
ct *= 10;
-- i;
}
}
void citire ()
{
int i, j;
freopen (FIN, "rt", stdin);
scanf ("%d%d%d%d", &N, &M, &s, &t);
scanf ("\n");
for (i = 1; i <= M; ++ i)
{
gets (sir);
get ();
++gr[a];
}
for (i = 1; i <= N; ++ i)
{
lv[i] = new int [gr[i] + 1];
cost[i] = new int [gr[i] + 1];
lv[i][0] = 0;
}
fseek (stdin, 0, SEEK_SET);
scanf ("%d%d%d%d", &N, &M, &s, &t);
scanf ("\n");
for (i = 1; i <= M; ++ i)
{
gets (sir);
get ();
lv[a][++lv[a][0]] = b;
cost[a][lv[a][0]] = c;
}
}
void combheap (int a)
{
int tata, fiu, v;
v = h[a];
tata = a;
fiu = 2*a;
while (fiu <= dimheap)
{
if (fiu < dimheap)
if (dist[h[fiu+1]] < dist[h[fiu]])
++ fiu;
if (dist[v] < dist[h[fiu]]) break;
h[tata] = h[fiu];
ind[h[tata]] = tata;
tata = fiu;
fiu = tata*2;
}
h[tata] = v;
ind[h[tata]] = tata;
}
void update (int a)
{
int tata, fiu, v;
v = h[a];
fiu = a;
tata = fiu / 2;
while (tata > 0)
{
if (dist[v] > dist[h[tata]]) break;
h[fiu] = h[tata];
ind[h[fiu]] = fiu;
fiu = tata;
tata = fiu / 2;
}
h[fiu] = v;
ind[h[fiu]] = fiu;
}
int max (int x, int y)
{
return x > y ? x : y;
}
void dijkstra ()
{
int i, j, nod, min;
memset (dist, INF, sizeof(dist));
dist[s] = 0;
dimheap = N;
for (i = 1; i <= N; ++ i)
{
h[i] = i;
ind[i] = i;
}
for (i = dimheap/2; i > 0; -- i)
combheap (i);
for (i = 1; i <= N; ++ i)
{
nod = h[1];
h[1] = h[dimheap--];
combheap (1);
for (j = 1; j <= lv[nod][0]; ++ j)
if (dist[lv[nod][j]] > max (dist[nod], cost[nod][j]))
{
dist[lv[nod][j]] = max (dist[nod], cost[nod][j]);
update (ind[lv[nod][j]]);
}
}
freopen (FOUT, "wt", stdout);
//for (i = 1; i <= N; ++ i)
// printf ("%d ", dist[i]);
printf ("%d\n", dist[t]);
}
int
main ()
{
citire ();
dijkstra ();
return 0;
}