很突兀,但是机房已经要关门了所以放在这里
没有注释十分抱歉
觉得自己可能是哪里脑抽了但是我看不出来
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=10*x+c-'0',c=getchar();
return x*f;
}
int n,m,q;
const int N=1e5+10;
const int M=3e5+10;
const int inf=1e9;
namespace ns{
int fa[N];
void init(){
for(int i=1;i<=n;i++) fa[i]=i;
}
int find(int x){
if(x==fa[x]) return x;
fa[x]=find(fa[x]);
return fa[x];
}
void merge(int a,int b){
a=find(a),b=find(b);
fa[a]=b;
}
}
typedef pair<int,pair<int,int> > pii;
bool cmp(pii a,pii b){return a.first>b.first;}
vector <pii> V;
vector <pair<int,int> > G[N];
namespace lca{
int st[N][20],ans[N][20],fa[N],dis[N];
void dfs(int u,int f,int val){
fa[u]=f,dis[u]=val;
st[u][0]=f;
for(int i=1;i<=19;i++){
st[u][i]=st[st[u][i-1]][i-1];
ans[u][i]=min(ans[st[u][i-1]][i-1],ans[u][i-1]);
}
for(auto k:G[u]){
int v=k.first,w=k.second;
if(v==f) continue;
ans[v][0]=w;
dfs(v,u,val+1);
}
}
int lca(int x,int y){
int res=inf;
if(dis[x]>dis[y]) swap(x,y);//Notice: Make sure x is higher than y
for(int k=19;k>=0;k--) if(dis[st[y][k]]>=dis[x]) res=min(res,ans[y][k]),y=st[y][k];
if(x==y) return res;
for(int k=19;k>=0;k--){
if(st[x][k]!=st[y][k]) res=min(res,min(ans[x][k],ans[y][k])),x=st[x][k],y=st[y][k];
}
return min(res,min(ans[x][0],ans[y][0]));
}
}
int main(){
n=read(),m=read(),q=read();
ns::init();
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
V.push_back({w,{u,v}});
}
sort(V.begin(),V.end(),cmp);
for(auto k:V){
int w=k.first,u=k.second.first,v=k.second.second;
if(ns::find(u)!=ns::find(v)){
ns::merge(u,v);
G[u].push_back({v,w});
G[v].push_back({u,w});
}
}
lca::dfs(1,0,0);
while(q--){
int u=read(),v=read();
if(ns::find(u)!=ns::find(v)){
cout<<"-1"<<endl;
}else{
cout<<lca::lca(u,v)<<endl;
}
}
return 0;
}