Pagini recente » Cod sursa (job #2315817) | Cod sursa (job #1402493) | Cod sursa (job #538189) | Cod sursa (job #2062443) | Cod sursa (job #298376)
Cod sursa(job #298376)
#include <iostream>
#include <algorithm>
#define FIN "radiatie.in"
#define FOUT "radiatie.out"
#define F first
#define S second
#define MAX_M 30010
#define MAX_N 15010
using namespace std;
int dad[MAX_N];
pair< int, pair< int ,int > > v[MAX_M];
int rank[MAX_N];
int depth[MAX_N];
int muchie[MAX_N];
int def[MAX_N];
int N,M,K;
void iofile(void){
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
memset(rank,0,sizeof(rank));
scanf("%d%d%d",&N,&M,&K);
for (int i=1;i<=N;++i) dad[i]=i;
for (int i=1;i<=M;++i) scanf("%d%d%d",&v[i].S.F,&v[i].S.S,&v[i].F);
return ;
}
int set(int x){
if (x==dad[x]) return x;
return set(dad[x]);
}
void merge(int x,int y,int cost){
int Sx=set(x);
int Sy=set(y);
if (Sx!=Sy){
if (rank[Sx]<rank[Sy]) { dad[Sx]=Sy;muchie[Sx]=cost; }
else {dad[Sy]=Sx;muchie[Sy]=cost;}
if (rank[Sx]==rank[Sy]) ++rank[Sx];
}
}
void get_depth(int nod){
if (def[nod]) return ;
def[nod]=1;
if (dad[nod]==nod){depth[nod]=1;} else {
get_depth(dad[nod]);
depth[nod]=depth[dad[nod]]+1;
}
}
void fill_depth(void){
memset(def,0,sizeof(def));
for (int i=1;i<=N;++i) if (!def[i]) get_depth(i);
}
void kruskal(void){
sort(v+1,v+M+1);
for (int i=1;i<=M;++i) merge(v[i].S.F,v[i].S.S,v[i].F);
}
int ask(int x, int y){
if (depth[x]<depth[y]){ int aux=x;x=y;y=aux;}
int maxim=0;
while (depth[x]>depth[y]){
maxim=max(maxim,muchie[x]);
x=dad[x];
}
while (x!=y){
maxim=max(maxim,muchie[x]);
maxim=max(maxim,muchie[y]);
x=dad[x];
y=dad[y];
}
return maxim;
}
void solve(void){
int x,y;
for (int i=1;i<=K;++i){
scanf("%d%d",&x,&y);
printf("%d\n",ask(x,y));
}
fclose(stdin);
fclose(stdout);
}
int main(void){
iofile();
kruskal();
fill_depth();
solve();
return 0;
}