Cod sursa(job #6875)

Utilizator vlad_popaVlad Popa vlad_popa Data 21 ianuarie 2007 10:22:29
Problema Radiatie Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.48 kb
#include <stdio.h>

#define FIN "radiatie.in"
#define FOUT "radiatie.out"
#define nmax 15001

struct nod {int vf, c;
            nod *next;};
nod *q;
typedef nod *pnod;
pnod a[nmax];

int d[nmax], s[nmax], i, j, k, n, m, x, y, cost, k2;
int nstart, min, poz, nfin;

void addmuchie (int x, int y, int cost)
{
  nod *p = new nod;
  p -> c = cost;
  p -> vf = y;
  p -> next = a[x];
  a[x] = p;
}

int max (int q, int r)
{
  if (q < r)
    return r;
  return q;
}

int
 main ()
{
  freopen (FIN, "rt", stdin);
  freopen (FOUT, "wt", stdout);
  
  scanf ("%d%d%d", &n, &m, &k2);
  for (i = 1; i <= m; i++)
   {
     scanf ("%d%d%d", &x, &y, &cost);
     addmuchie (x, y, cost);
     addmuchie (y, x, cost);
   }
  while (k2)
  {
    scanf ("%d%d", &nstart, &nfin);
    for (i = 1; i <= n; i++)
      if (i != nstart)
       {
         d[i] = 1000000001;
         s[i] = 0;
       }
    d[nstart] = 0;
    for (q = a[nstart]; q != NULL; q = q -> next)
      d[q -> vf] = q -> c;
    s[nstart] = 1;
    for (k = 1; k < n; k++)
     {
       min = 1000000001;
       for (i = 1; i <= n; i++)
         if (s[i] != 1)
           if (d[i] < min)
            {
              min = d[i];
              poz = i;
            }
       s[poz] = 1;
       for (q = a[poz]; q != NULL; q = q -> next)
         if (d[q -> vf] > max (min, q -> c))
           d[q -> vf] = max (min, q -> c);
      }
     k2--;
     printf ("%d\n", d[nfin]);
   }
  return 0;
}