Cod sursa(job #24544)

Utilizator cos_minBondane Cosmin cos_min Data 2 martie 2007 20:26:24
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.6 kb
#include <stdio.h>
#include <fstream>
#include <limits>
using namespace std;

#define infinit numeric_limits<long long>::max()
#define in "radiatie.in"
#define out "radiatie.out"
#define dim 15001
#define inf 1000000001
#define ll long long

struct muchie {
       int a, b;
       long long cost;
} p[2*dim];

int t[dim], niv[dim], d[dim];
int n, m, k;

typedef struct nod {
        int vf;
        ll cost;
        bool ok;
        nod* next;
}*PNOD;

PNOD graph[dim];
bool sel[dim];

void ReadData();
void GG(int,int);
void Kruskal();
int Find(int);
void Union(int,int);
void Qsort(int,int);
void Add(int,int,int);
ll BF(int,int);

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

void ReadData()
{
     int x,y;
     ll c;
     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%lld",&y,&x,&c);
         p[i].a = x;
         p[i].b = y;
         p[i].cost = c;
         Add(x,y,c);
         Add(y,x,c);
     }
     
     Qsort(1,m);
     Kruskal();
     
     for ( int i = 1; i <= k; i++ )
     {
         scanf("%d%d",&x,&y);
         printf("%d\n",BF(x,y));
     }
}

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

ll BF(int nod, int dest)
{
    int q[dim];
    for ( int i = 1; i <= n; i++ ) d[i] = 0, sel[i] = 0, q[i] = 0;
    
    d[nod] = 0;
    
    int p,u;
    
    q[p=u=1] = nod;
    sel[nod] = 1;
    
    while ( p <= u )
    {
        int i = q[p];
        for ( PNOD g = graph[i]; g; g=g->next )
        {
            if ( g->ok == 1 && !sel[i] )
            {
                 if ( d[g->vf] < Maxim(d[i],g->cost) ) d[g->vf] = Maxim(d[i],g->cost);
                 q[++u] = g->vf;     
            }
        }
        p++;
    }
    
    return d[dest];
}

void Add(int i, int j, int c)
{
     PNOD q = new nod;
     q->vf = i;
     q->ok = 0;
     q->cost = c;
     q->next = graph[j];
     graph[j] = q;
}

void Qsort(int st, int dr)
{
     int i = st - 1;
     int j = dr + 1;
     ll pivot = p[st].cost;
     
     while ( i <= j )
     {
           do { i++; } while ( p[i].cost < pivot );
           do { j--; } while ( p[j].cost > pivot );
           if ( i <= j )
           {
                muchie aux = p[i];
                p[i] = p[j];
                p[j] = aux;
           }
     }
     
     if ( st < j ) Qsort(st,j);
     if ( i < dr ) Qsort(i,dr);
}

int Find(int x)
{
     if ( x != t[x] ) t[x] = Find(t[x]);
     return t[x];
}

void Union(int x, int y)
{
     if ( x != y )
     {
          if ( niv[x] > niv[y] ) t[y] = x;
          else
          {
              t[x] = y;
              if ( niv[x] == niv[y] ) niv[y]++;
          }
     }
     
}

void Kruskal()
{
     for ( int i = 1; i <= n; i++ ) niv[t[i]=i] = 0;  
     
     int k = 0;
     
     for ( int i = 1; i <= m; i++ )
     {
         int r1 = Find(p[i].a);
         int r2 = Find(p[i].b);
         
         if ( r1 != r2 )
         {
              GG(p[i].a,p[i].b);
              k++;
              Union(r1,r2);
              if ( k == n-1 ) break;
         }
     }
     
     for ( int i = 1; i <= n; i++ ) sel[i] = niv[t[i]=i] = 0;
}

void GG(int i, int j)
{
     for ( PNOD q = graph[i]; q; q=q->next )
         if ( q->vf == j )
         {
              q->ok = 1;
              break;
         } 
     
     for ( PNOD q = graph[j]; q; q=q->next )
         if ( q->vf == i )
         {
              q->ok = 1;
              break;
         }
}