rt,样例能过,#1 RE
#include<bits/stdc++.h>
#define v to[i]
#define w val[i]
using namespace std;
const int N=2e4,M=1e5;
int tot,head[N],nxt[N<<1],to[N<<1],val[N<<1];
int n,m,q,fa[N],depth[N],f[N][15],minv[N][15];
struct edge
{
int x,y,z;
bool operator <(edge o)const {
return z>o.z;
}
}e[M];
int read() {
int x=0; char ch=0; while (!isdigit(ch) ) ch=getchar();
while (isdigit(ch) ) x=(x<<3)+(x<<1)+(ch&15),ch=getchar();
return x;
}
void add(int x,int y,int z) {
to[tot]=y,val[tot]=z,nxt[tot]=head[x],head[x]=tot++;
to[tot]=x,val[tot]=z,nxt[tot]=head[y],head[y]=tot++;
}
int find(int x) {
return fa[x]^x?fa[x]=find(fa[x]):x;
}
bool merge(int x,int y) {
x=find(x),y=find(y);
fa[x]=y; return x^y;
}
int kruskal()
{
sort(e,e+m);
for (int i=0;i<m;i++)
if (merge(e[i].x,e[i].y) )
add(e[i].x,e[i].y,e[i].z);
}
void dfs(int u,int Fa) {
for (int i=1;i<15;i++) f[u][i]=f[f[u][i-1] ][i-1],minv[u][i]=min(minv[u][i-1],minv[f[u][i-1] ][i-1]);
depth[u]=depth[Fa]+1; for (int i=head[u];~i;i=nxt[i]) if (v^Fa) f[v][0]=u,minv[v][0]=w,dfs(v,u);
}
int LCA(int x,int y)
{
int ans=1e9; if (depth[x]>depth[y]) swap(x,y); for (int i=14;~i;i--)
if (depth[x]<=depth[f[y][i] ]) ans=min(ans,minv[y][i]),y=f[y][i]; if (x==y) return ans;
for (int i=14;~i;i--) if (f[x][i]^f[y][i]) ans=min(ans,min(minv[x][i],minv[y][i]) ),x=f[x][i],y=f[y][i];
return min(ans,min(minv[x][0],minv[y][0]) );
}
void clear()
{
tot=0;
memset(f,0,sizeof f);
memset(minv,0x3f,sizeof minv);
memset(depth,0,sizeof depth);
}
int main()
{
while (~scanf("%d%d%d",&n,&m,&q) )
{
clear();
memset(head,-1,sizeof head);
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=0;i<m;i++) e[i]={read(),read(),read()};
kruskal(); for (int i=1;i<=n;i++) if (!depth[i]) dfs(i,0);
while (q--) printf("%d\n",LCA(read(),read() ) );
}
return 0;
}