不太明白哪里写挂了 qwq
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 5e5 + 10;
struct Edge {
int u, v, w, nxt;
} edge1[maxn << 1], edge[maxn << 1]; int head1[maxn], head[maxn], tot1, tot;
inline void init1(int u, int v, int w) {
edge1[++tot1] = (Edge){ u, v, w, head1[u] }; head1[u] = tot1;
}
inline void init(int u, int v, int w) {
edge[++tot] = (Edge){ u, v, w, head[u] }; head[u] = tot;
}
int n, m, k, f[maxn];
int d[maxn], fa[maxn][22], t, ans = 0x3f3f3f3f, mn[maxn][22]; bool vis[maxn]; queue<int> q;
int anc(int x) {
if (f[x] == x) return x;
return f[x] = anc(f[x]);
}
inline bool cmpa(Edge a, Edge b) {
return a.w > b.w;
}
inline void kruskal() {
int cntt = 0;
sort(edge1 + 1, edge1 + 1 + tot1, cmpa);
for (int i = 1; i <= tot1; ++i) {
int u = edge1[i].u, v = edge1[i].v, w = edge1[i].w;
int fau = anc(u), fav = anc(v);
if (fau == fav) continue;
init(u, v, w); init(v, u, w);
f[fau] = fav;
if (++cntt == n - 1) return;
}
}
inline void bfs(int root) {
d[root] = 1; q.push(root);
while (q.size()) {
int u = q.front(); q.pop();
vis[u] = true;
for (int i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].v, w = edge[i].w;
if (d[v]) continue;
d[v] = d[u] + 1;
fa[v][0] = u; mn[v][0] = w;
for (int j = 1; j <= t; ++j) {
fa[v][j] = fa[fa[v][j - 1]][j - 1];
mn[v][j] = min(mn[v][j - 1], mn[fa[v][j - 1]][j - 1]);
}
q.push(v);
}
}
}
inline int lca(int x, int y) {
if (x > y) swap(x, y);
for (int i = t; i >= 0; --i) {
if (d[fa[y][i]] >= d[x]) {
ans = min(ans, mn[y][i]);
y = fa[y][i];
}
}
if (x == y) return x;
for (int i = t; i >= 0; --i) {
if (fa[x][i] != fa[y][i]) {
ans = min(ans, min(mn[x][i], mn[y][i]));
x = fa[x][i], y = fa[y][i];
}
}
ans = min(ans, min(mn[x][0], mn[y][0]));
return fa[x][0];
}
int main() {
memset(mn, 0x3f, sizeof(mn));
scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) f[i] = i; t = int(log(n) / log(2)) + 1;
for (int i = 1; i <= m; ++i) {
int p1, p2, pw; scanf("%d%d%d", &p1, &p2, &pw);
init1(p1, p2, pw); init1(p2, p1, pw);
}
kruskal();
for (int i = 1; i <= n; ++i) {
if (!vis[i]) bfs(i);
}
scanf("%d", &k);
for (int i = 1; i <= k; ++i) {
int p1, p2; scanf("%d%d", &p1, &p2);
int fau = anc(p1), fav = anc(p2);
if (fau != fav) {
printf("-1\n");
continue;
}
ans = 0x3f3f3f3f;
int Lca = lca(p1, p2);
printf("%d\n", ans);
}
return 0;
}