Cod sursa(job #690386)

Utilizator giuliastefGiulia Stef giuliastef Data 25 februarie 2012 16:31:22
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
// Radiatie
 
#include <cstdio>
#include <algorithm>
#define NMAX 15011
using namespace std;
int N,M,Q;
int Dad[NMAX],Rang[NMAX],Cost[NMAX],Viz[NMAX];
struct edge{
       int x,y,c;
} V[2*NMAX+1];

bool Cmp(edge X, edge Y){
     return X.c<Y.c;
}
inline int Maxim(int X,int Y){
       if(X>=Y) return X;
       return Y;
}
inline int Find (int X){
       for(;X!=Dad[X];X=Dad[X]);
       return X;
}
void Unite(int X, int Y, int C){
     if(Rang[X]<Rang[Y]){
       Dad[X]=Y; 
       Cost[X]=C;
     }
     else {
          Dad[Y]=X;
          Cost[Y]=C;
          }
     if(Rang[X]==Rang[Y]) Rang[X]++;
}
void Kruskal(){
     int i,X,Y;
     for(i=1;i<=N;i++)
      Dad[i]=i;
     sort(V+1,V+M+1, Cmp);
     for(i=1;i<=M;i++){
       X=Find(V[i].x);
       Y=Find(V[i].y);
       if(X!=Y){
        Unite(X,Y,V[i].c);
       }
     }
}
int LCA(int X, int Y, int i){
    for(;X!=Dad[X]; Viz[X]=i, X=Dad[X]);
    for(;Y!=Dad[Y] && Viz[Y]!=i; Y=Dad[Y]);
    return Y;
}
int Query(int X, int Y, int i){
     int R,C;
     C=0;
     R=LCA(X,Y,i);
     for(;X!=R;X=Dad[X]) C=Maxim(C,Cost[X]);
     for(;Y!=R;Y=Dad[Y]) C=Maxim(C,Cost[Y]);
     return C;
}
void Read(){
     int i=0;
     freopen("radiatie.in","r",stdin);
     scanf("%d %d %d", &N, &M, &Q);
     for(i=1; i<=M; i++){
      scanf("%d %d %d", &V[i].x, &V[i].y, &V[i].c);
     }
}
void Solve(){
     int x,y;
     freopen("radiatie.out","w",stdout);
     Kruskal();
     for(;Q>0;Q--){
      scanf("%d %d",&x,&y);
      printf("%d\n",Query(x,y,Q));
     }
}
int main(){
    Read();
    Solve();
    return 0;
}