样例都过不了,qwq
码风太乱,请原谅
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
#define int long long
struct node {
int u, v, w;
} e[N];
struct edge {
int v, w;
};
int n, m, q;
int f[N], dep[N], vis[N];
int min_w[N][25], fa[N][25];
vector<edge> vec[N];
bool cmp(node x, node y) {
return x.w > y.w;
}
int find(int x) {
if (f[x] != x)return f[x] = find(f[x]);
return x;
}
int w(int u, int v) {
for (auto it : vec[u])if (it.v == v)return it.w;
}
void dfs(int x, int f) {
vis[x] = 1;
dep[x] = dep[f] + 1;
fa[x][0] = f;
min_w[x][0] = w(x, f);
for (int i = 1; i <= 20; i++) {
fa[x][i] = fa[fa[x][i - 1]][i - 1];
min_w[x][i] = min(min_w[x][i - 1], min_w[fa[x][i - 1]][i - 1]);
}
for (auto it : vec[x])if (it.v != f)dfs(it.v, x);
}
void kruskal() {
for (int i = 1; i <= n; i++)f[i] = i;
sort(e + 1, e + n + 1, cmp);
int cnt = n;
for (int i = 1; i <= m; i++) {
if (cnt == 1)break;
int fx = find(e[i].u);
int fy = find(e[i].v);
if (fx == fy) continue;
f[fx] = fy;
cnt--;
vec[fx].push_back({fy, e[i].w});
vec[fy].push_back({fx, e[i].w});
}
}
int query(int x, int y) {
if (find(x) != find(y))return -1;
int res = INT_MAX;
if (dep[x] < dep[y])swap(x, y);
for (int i = 20; i >= 0; i--) {
if ((1 << i) & (dep[x] - dep[y])) {
res = min(min_w[x][i], res);
x = fa[x][i];
}
}
if (x == y)return x;
for (int i = 20; i >= 0; i--) {
if (fa[x][i] != fa[y][i]) {
x = fa[x][i];
y = fa[y][i];
res = min(min_w[x][0], res);
res = min(min_w[y][0], res);
}
}
res = min(min_w[x][0], res);
res = min(min_w[y][0], res);
return res;
}
signed main() {
memset(min_w, 0x3f3f3f3f, sizeof(min_w));
cin >> n >> m;
for (int i = 1; i <= m; i++) cin >> e[i].u >> e[i].v >> e[i].w;
kruskal();
for (int i = 1; i <= n; i++)if (vis[i] != 0)dfs(i, 0);
cin >> q;
for (int i = 1; i <= q; i++) {
int x, y;
cin >> x >> y;
cout << query(x, y) << endl;
}
return 0;
}