代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,q,cnt,head[100100],fa[100100][15],fai[100100],minn[100100][15],dep[100100];
struct kruskal{
int from,to,val;
bool operator <(const kruskal &b)const{
return val<b.val ;
}
}line[300100];
struct node{
int to,next,val;
}a[200100];
inline int read(){
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s;
}
int mymax(int x,int y){
if(x>y)return x;
else return y;
}
void add(int u,int v,int w){
++cnt;
a[cnt].to =v;
a[cnt].next =head[u];
a[cnt].val =w;
head[u]=cnt;
}
int find(int x){
return fai[x]==x?x:find(fai[x]);
}
void build(int x,int f){
for(int i=head[x];i;i=a[i].next ){
int v=a[i].to ;
if(f!=v){
dep[v]=dep[x]+1;
fa[v][0]=x;
minn[v][0]=a[i].val ;
build(v,x);
}
}
}
int query(int x,int y){
int ans=-1;
if(dep[x]<dep[y])swap(x,y);
for(int i=14;i>=0;i--){
if(fa[x][i]&&dep[fa[x][i]]>=dep[y]){
ans=mymax(ans,minn[x][i]);
x=fa[x][i];
}
}
if(x==y)return ans;
for(int i=14;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
ans=mymax(ans,minn[x][i]);
ans=mymax(ans,minn[y][i]);
x=fa[x][i];
y=fa[y][i];
}
}
ans=mymax(ans,minn[x][0]);
ans=mymax(ans,minn[y][0]);
return ans;
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++){
int u,v,w;
if(i<=n)fai[i]=i;
u=read();v=read();w=read();
line[i]=((kruskal){u,v,w});
}
sort(line+1,line+1+m);
int js=0;
for(int i=1;i<=m;i++){
int u=find(line[i].from ),v=find(line[i].to );
if(u!=v){
fai[u]=v;
add(line[i].from ,line[i].to ,line[i].val );
add(line[i].to ,line[i].from ,line[i].val );
++js;
if(js+1==n)break;
}
}
for(int i=1;i<=n;i++){
if(!dep[i]){
dep[i]=1;
build(i,i);
}
}
for(int i=1;i<=15;i++){
for(int j=1;j<=n;j++){
fa[j][i]=fa[fa[j][i-1]][i-1];
minn[j][i]=mymax(minn[j][i-1],minn[fa[j][i-1]][i-1]);
}
}
q=read();
for(int i=1;i<=q;i++){
int u,v;
u=read();v=read();
if(find(u)!=find(v))cout<<"impossible"<<endl;
else cout<<query(u,v)<<endl;
}
return 0;
}