重题过了,多测 wa
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 100;
int n, m, tot, num, head[N], fa[N], f[N][20], dis[N][20], depth[N], minn, q, lg[N];
bool vis[N];
struct Edge{
int to, nxt, k;
} e[N];
struct Node{
int x, y, z;
const bool operator < (const Node& e) const {
return z > e.z;
}
} a[N];
void add(int x, int y, int z) {
e[++tot].to = y;
e[tot].k = z;
e[tot].nxt = head[x];
head[x] = tot;
}
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void dfs(int x, int y, int z) {
vis[x] = 1;
depth[x] = depth[y] + 1;
f[x][0] = y;
dis[x][0] = z;
for (int i = 1; (1 << i) <= depth[x]; i++) {
f[x][i] = f[f[x][i - 1]][i - 1];
dis[x][i] = min(dis[x][i - 1], dis[f[x][i - 1]][i - 1]);
}
for (int i = head[x]; i; i = e[i].nxt) {
if (e[i].to != y) {
dfs(e[i].to, x, e[i].k);
}
}
return;
}
int LCA(int x, int y) {
if (find(x) != find(y)) {
return -1;
}
if (depth[x] < depth[y]) {
swap(x, y);
}
// cout << lg[depth[x]] << ' ' << lg[depth[y]] << endl;
while (depth[x] > depth[y]) {
minn = min(minn, dis[x][lg[depth[x] - depth[y]] - 1]);
x = f[x][lg[depth[x] - depth[y]] - 1];
// cout << x << endl;
}
if (x == y) {
return minn;
}
for (int i = lg[depth[x]] - 1; i >= 0; i--) {
if (f[x][i] != f[y][i]) {
minn = min(minn, dis[x][i]);
minn = min(minn, dis[y][i]);
x = f[x][i];
y = f[y][i];
}
}
minn = min(minn, min(dis[x][0], dis[y][0]));
return minn;
}
signed main() {
while (cin >> n >> m >> q) {
for (int i = 1; i <= m; i++) {
cin >> a[i].x >> a[i].y >> a[i].z;
}
memset(fa, 0, sizeof(fa));
tot = 0;
memset(e, 0, sizeof(e));
num = 0;
memset(vis, 0, sizeof(vis));
memset(depth, 0, sizeof(depth));
memset(dis, 0, sizeof(dis));
memset(f, 0, sizeof(f));
memset(head, 0, sizeof(head));
memset(lg, 0, sizeof(lg));
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
sort(a + 1, a + m + 1);
for (int i = 1; i <= m; i++) {
int nx = find(a[i].x);
int ny = find(a[i].y);
if (nx == ny) {
continue;
}
fa[nx] = ny;
add(a[i].x, a[i].y, a[i].z);
add(a[i].y, a[i].x, a[i].z);
num++;
if (num == n - 1) {
break;
}
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
dfs(i, 0, 0);
}
}
for (int i = 1; i <= n; i++) {
lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
}
for (int i = 1; i <= q; i++) {
int x, y;
cin >> x >> y;
minn = 1e9;
cout << LCA(x, y) << endl;
}
}
return 0;
}
/*
10 24
4 7 19038
7 10 7375
7 9 17853
9 8 6341
7 2 16976
10 3 2835
10 4 19285
9 4 29193
3 4 4852
3 8 16597
9 1 4138
9 7 21611
7 4 10586
10 4 7821
10 9 25636
3 9 28425
2 3 17229
4 8 11331
9 2 25053
6 4 929
8 3 1738
10 9 28542
1 2 28343
3 5 13215
9
7 5
2 4
10 2
5 10
7 10
4 3
10 1
10 4
8 4
*/