正解,TLE 60 分,求调,玄关。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 5e4 + 4, N = 1e4 + 4;
int n, m, q, x, y;
int dep[N], f[N][18], g[N][18];
bool vis[N];
struct edge_ {
int u, v, w;
} e[M];
struct edge {
int v, w;
};
vector <edge> G[N];
int f_[N];
bool cmp(edge_ x, edge_ y) {
return (x.w > y.w);
}
int find(int x) {
return (f_[x] == x) ? x : (f_[x] = find(f_[x]));
}
void Kruskal(void) {
for (int i = 1; i <= n; ++i) {
f_[i] = i;
}
sort(e + 1, e + m + 1, cmp);
int num = 0;
for (int i = 1; i <= m; ++i) {
int u = e[i].u, v = e[i].v, w = e[i].w;
int fu = find(u), fv = find(v);
if (fu != fv) {
f_[fu] = fv;
G[u].push_back((edge){v, w});
G[v].push_back((edge){u, w});
++num;
}
if (num == n - 1) break;
}
return ;
}
void dfs(int u, int fa) {
for (int i = 0; i < G[u].size(); ++i) {
int v = G[u][i].v, w = G[u][i].w;
if (v == fa) continue;
dep[v] = dep[u] + 1;
f[v][0] = u;
g[v][0] = w;
dfs(v, u);
}
return ;
}
int Lca(int x, int y) {
int ans = INT_MAX;
if (dep[x] > dep[y]) swap(x, y);
for (int d = dep[y] - dep[x], i = 0; i < 18; ++i) {
if ((d >> i) & 1) {
ans = min(ans, g[y][i]);
y = f[y][i];
}
if (dep[x] == dep[y]) break;
}
if (x == y) return ans;
for (int i = 17; i >= 0; --i) {
if (f[x][i] != f[y][i]) {
ans = min(ans, min(g[x][i], g[y][i]));
x = f[x][i], y = f[y][i];
}
}
ans = min(ans, min(g[x][0], g[y][0]));
return ans;
}
int main(void) {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++i) {
scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].w);
}
Kruskal();
memset(g, 0x3f, sizeof g);
for (int i = 1; i <= n; ++i) {
if (!vis[i]) {
dfs(i, 0);
}
}
for (int j = 1; j < 18; ++j) {
for (int i = 1; i <= n; ++i) {
f[i][j] = f[f[i][j - 1]][j - 1];
g[i][j] = min(g[i][j - 1], g[f[i][j - 1]][j - 1]);
}
}
scanf("%d", &q);
while (q--) {
scanf("%d %d", &x, &y);
if (find(x) != find(y)) {
printf("-1\n");
continue;
}
int ans = Lca(x, y);
printf("%d\n", ans);
}
return 0;
}