Cod sursa(job #32764)

Utilizator vlad_popaVlad Popa vlad_popa Data 18 martie 2007 14:13:13
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
using namespace std;

#include <cstdio>
#include <string>

#define FIN "pscnv.in"
#define FOUT "pscnv.out"
#define NMAX 100001
#define INF 0x3f3f3f3f

int N, M, dimheap, *lv[NMAX], *cost[NMAX], gr[NMAX];
int h[NMAX], ind[NMAX], dist[NMAX], t, s;

void citire ()
{
  int i, j, a, b, c;

  freopen (FIN, "rt", stdin);

  scanf ("%d%d%d%d", &N, &M, &s, &t);
  for (i = 1; i <= M; ++ i)
   {
     scanf ("%d%d%d", &a, &b, &c);
     ++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);
  for (i = 1; i <= M; ++ i)
   {
     scanf ("%d%d%d", &a, &b, &c);
     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;
}