Cod sursa(job #133717)

Utilizator floringh06Florin Ghesu floringh06 Data 9 februarie 2008 16:06:57
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define FIN "radiatie.in"
#define FOUT "radiatie.out"
#define MAX_N 30005

int X[MAX_N];
int Y[MAX_N];
int T[MAX_N];
int H[MAX_N];

int BEST; // solutia
int N, M, i, t1, t2;
int h1, h2, x_v, y_v;
int K;

int C[MAX_N];
int Cc[MAX_N];

    void sort (int st, int dr)
    {
         if (st < dr)
         {
                int i = st, j = dr;
                int i_v = 1, j_v = 0;
                while (i != j)
                {
                      if (C[i] > C[j])
                      {
                               int ax = X[i]; X[i] = X[j]; X[j] = ax;
                                   ax = Y[i]; Y[i] = Y[j]; Y[j] = ax;
                                   ax = C[i]; C[i] = C[j]; C[j] = ax;
                                   ax = i_v; 
                                   i_v = -j_v;
                                   j_v = -ax;
                      }
                      i += i_v;
                      j += j_v;
                }
                --i; ++j;
                while (i > st && C[i] == C[i - 1]) --i;
                while (j < dr && C[j] == C[j + 1]) ++j;
                sort (st, i);
                sort (j, dr);
         }
    }
    
    int CMP (int c)
    {
        while (T[c]) c = T[c];
        return c;
    }
    
    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        scanf ("%d %d %d", &N, &M, &K);
        for (i = 1; i <= M; ++i)
            scanf ("%d %d %d", X + i, Y + i, C + i);
        
        sort (1, M);
        for (i = 1; i <= M; ++i)
        {
            t1 = CMP(X[i]); 
            t2 = CMP(Y[i]);
            if (t1 != t2)
               if (H[t1] < H[t2])
               {
                         T[t1] = t2;
                         Cc[t1] = C[i];
               }
               else 
               {
                    T[t2] = t1; 
                    Cc[t2] = C[i];
                    if (H[t1] == H[t2])
                       ++H[t1];
               }
        }
        
        for (i = 1; i <= K; ++i)
        {
            scanf ("%d %d", &x_v, &y_v);
            h1 = h2 = 0;
            t1 = x_v, t2 = y_v;
            while (t1 != 0)
            {
                  ++h1;
                  t1 = T[t1];
            }
            while (t2 != 0)
            {
                  ++h2;
                  t2 = T[t2];
            }
            
            BEST = -1;
            t1 = x_v, t2 = y_v;
            while (t1 != t2)
                  if (h1 > h2)
                  {
                         if (BEST < Cc[t1]) BEST = Cc[t1];
                         --h1;
                         t1 = T[t1];
                  }
                  else 
                  {
                         if (BEST < Cc[t2]) BEST = Cc[t2];
                         --h2;
                         t2 = T[t2];
                  }
            printf ("%d\n", BEST);
        }
        
        return 0;
    }