rt,10pts,不知道哪里错了。
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5, M = 5e4 + 4, K = 24;
struct O {
int from, to, val;
friend bool operator <(O a, O b) {
return a.val > b.val;
}
} path[M];
struct node {
int to, val;
};
int n, m;
int p[N]; // 并查集数组
int d[N]; // 深度
int f[N][K]; // 倍增
int fath[N][K]; // 父亲数组
vector<node>g[N]; // 存图(krus后的新图)
int _find(int u) {
return p[u] == u ? u : p[u] = _find(p[u]);
}
void kru() {
for (int i = 1; i <= n; i++) {
p[i] = i;
}
sort(path + 1, path + m + 1);
for (int i = 1; i <= m; i++) {
if (_find(path[i].from) != _find(path[i].to)) {
// cout<<i<<" !!\n";
p[_find(path[i].from)] = _find(path[i].to);
g[path[i].to].push_back({path[i].from, path[i].val});
g[path[i].from].push_back({path[i].to, path[i].val});
}
}
return ;
}
void dfs(int u, int fa) {
d[u] = d[fa] + 1;
fath[u][0] = fa;
for (int i = 1; (1 << i) < d[u]; i++) {
f[u][i] = min(f[u][i - 1], f[fath[u][i - 1]][i - 1]);
fath[u][i] = fath[fath[u][i - 1]][i - 1];
}
for (int i = 0; i < g[u].size(); i++) {
int p = g[u][i].to;
if (p != fa) {
f[p][0] = g[u][i].val;
dfs(p, u);
}
}
}
int lca(int u, int v) {
int ans = 2e9;
if (d[u] < d[v]) swap(u, v);
for (int i = K - 1; i >= 0; i--) {
// cout << ans << '\n';
if (d[fath[u][i]] >= d[v]) {
// cout<<"U: " << u<< " , V:" << f[u][i] <<" i: "<< i<<'\n';
ans = min(ans, f[u][i]);
u = fath[u][i];
}
}
if ( u == v) return ans;
for (int i = K - 1; i >= 0; i--) {
if (fath[u][i] != fath[v][i]) {
ans = min({ans, f[u][i], f[v][i]});
cout << ans << '\n';
u = fath[u][i];
v = fath[v][i];
}
}
return min({f[u][0], ans, f[v][0]});
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> path[i].from >> path[i].to >> path[i].val;
}
kru();
for (int i = 1; i <= n; i++) {
if (!d[i]) dfs(i, 0);
}
int T;
cin >> T;
while (T--) {
int x, y;
cin >> x >> y;
if (_find(x) != _find(y)) {
cout << -1 << '\n';
continue;
}
cout << lca(x, y) << endl;
}
return 0;
}