#include <bits/stdc++.h>
#define N 100005
#define M 30
#define INF 0x7fffffff/2
#define f(x, y) x ^= y, y ^= x, x ^= y
using namespace std;
struct node {
int x;
int y;
int dis;
};
node g[500005];
struct node1 {
int to;
int next;
int w;
};
node1 e[500005];
int cnt, n, m, h[N], f[N], prt[N][M], w[N][M], deep[N];
bool v[N];
inline int read() {
char ch = getchar();
int f = 0, w = 1;
while(ch < '0' || ch > '9') {
if(ch == '-') w = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
f = f * 10 + ch - '0',
ch = getchar();
}
return f * w;
}
inline void Add(int x, int y, int z) {
cnt++ ;
e[cnt].next = h[x];
e[cnt].to = y;
e[cnt].w = z;
h[x] = cnt;
}
inline bool cmp(node x, node y) {
return x.dis > y.dis;
}
inline int find(int x) {
if (f[x] != x)
f[x] = find(f[x]);
return f[x];
}
inline void k() {
sort(g + 1, g + m + 1, cmp);
for (int i=1; i<=n; i++ )
f[i] = i;
for (int i=1; i<=m; i++ ) {
if (find(g[i].x) != find(g[i].y)) {
f[find(g[i].x)] = find(g[i].y);
Add(g[i].x, g[i].y, g[i].dis);
Add(g[i].y, g[i].x, g[i].dis);
}
}
return ;
}
inline void dfs(int x) {
v[x] = 1;
for (int i=h[x]; i; i=e[i].next) {
int to = e[i].to;
if (v[to])
continue;
deep[to] = deep[x] + 1;
prt[to][0] = x;
w[to][0] = e[i].w;
dfs(to);
}
return ;
}
inline int LCA(int a, int b) {
if (find(a) != find(b))
return -1;
int ans = INF;
if (deep[a] > deep[b])
f(a, b);
for (int i=20; i>=0; i-- )
if (deep[prt[n][i]] >= deep[a]) {
ans = min(ans, w[b][i]);
b = prt[b][i];
}
if (a == b)
return ans;
for (int i=20; i>=0; i-- )
if (prt[a][i] != prt[b][i]) {
ans = min(ans, min(w[a][i], w[b][i]));
a = prt[a][i];
b = prt[b][i];
}
ans = min(ans, min(w[a][0], w[b][0]));
return ans;
}
inline void st() {
for (int i=1; i<=n; i++ ) {
if (!v[i]) {
deep[i] = 1;
dfs(i);
prt[i][0] = i;
w[i][0] = INF;
}
}
}
inline void lcainit() {
for (int j=1; j<=20; j++ ) {
for (int i=1; i<=n; i++ ) {
prt[i][j] = prt[prt[i][j - 1]][j - 1];
w[i][j] = min(w[i][j - 1], w[prt[i][j - 1]][j - 1]);
}
}
}
int main() {
n = read();
m = read();
for (int i=1; i<=m; i++ ) {
int x, y, z;
x = read();
y = read();
z = read();
g[i].x = x;
g[i].y = y;
g[i].dis = z;
}
k();
st();
lcainit();
int q;
q = read();
for (int i=1; i<=q; i++ ) {
int x, y;
x = read();
y = read();
printf("%d\n", LCA(x, y));
}
return 0;
}
最开始全错,看着题解打了一遍还是错的