Cod sursa(job #6874)

Utilizator cos_minBondane Cosmin cos_min Data 21 ianuarie 2007 10:16:19
Problema Radiatie Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 2.05 kb
#include<stdio.h>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;

#define in "radiatie.in"
#define out "radiatie.out"
#define dim 15001
#define inf 1000000001

int d[dim], x[dim], y[dim];

typedef struct nod {
        int vf, cost;
        nod* next;
} *PNOD;

PNOD graph[dim];

struct Comp {
       bool operator () ( int i, int j ) const {
            return d[i] < d[j];
       }
};

multiset<int, Comp> q;
bool sel[dim];
int n, m, k;

void ReadData();
int Dijkstra(int,int);
void Add(int,int,int);
int Maxim(int,int);

int main()
{
    ReadData();
    
    return 0;
}

void ReadData()
{
     int k1, k2, k3;
     freopen(in,"r",stdin);
     freopen(out,"w",stdout);
     
     scanf("%d%d%d",&n,&m,&k);
     
     for ( int i = 1; i <= m; ++i )
     {
         scanf("%d%d%d", &k1,&k2,&k3);
         Add(k1,k2,k3);
         Add(k2,k1,k3);
     }
     
     for ( int i = 1; i <= k; ++i )
     {
         scanf("%d%d",&k1,&k2);
         printf("%d\n", Dijkstra(k1,k2));
     }
}

void Add(int i, int j, int k)
{
     PNOD w = new nod;
     w->vf = i;
     w->cost = k;
     w->next = graph[j];
     graph[j] = w;
}

int Maxim(int a,int b)
{
    return a > b ? a : b;
}

int Dijkstra(int sursa, int dest)
{
    for ( int i = 1; i <= n; i++ ) 
    {
        d[i] = inf;
        sel[i] = false;
    }
    
    q.clear();
    q.insert(sursa);
    d[sursa] = 0;
    sel[sursa] = true;
    
    while ( !q.empty() )
    {
          int poz = *q.begin();
          q.erase( q.begin() );
          sel[poz] = 0;
          
          for ( PNOD w = graph[poz]; w; w=w->next )
          {
              if (d[w->vf] > Maxim(d[poz],w->cost) )
              {
                   if ( sel[w->vf] ) q.erase(w->vf);
                   else              sel[w->vf] = true;
                   
                   d[w->vf] = Maxim(d[poz],w->cost);
                   q.insert(w->vf);
              }
          }
    }
    
    return d[dest];
                    
}