#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 20009, M = 40009;
int n, m;
int h[N], e[M], w[M], ne[M], tot;
int f[N][20], d[N], dis[N], dep;
void add(int a, int b, int c) {
e[++ tot] = b; w[tot] = c; ne[tot] = h[a]; h[a] = tot;
}
void bfs() {
d[1] = 1;
queue<int> q;
q.push(1);
while(q.size()) {
int x = q.front();
q.pop();
for(int i = h[x]; i; i = ne[i]) {
int y = e[i];
if(d[y]) continue;
q.push(y);
d[y] = d[x] + 1;
dis[y] = dis[x] + w[i];
f[y][0] = x;
for(int k = 1; k <= dep; k ++)
f[y][k] = f[f[y][k - 1]][k - 1];
}
}
}
int lca(int x, int y) {
if(d[x] < d[y]) swap(x, y);
for(int i = dep; i >= 0; i --)
if(d[f[x][i]] >= d[y]) x = f[x][i];
if(x == y) return x;
for(int i = dep; i >= 0; i --)
if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
return f[x][0];
}
int main() {
cin >> n >> m;
for(int i = 0; i < n - 1; i ++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a, b, c), add(b, a, c);
}
dep = 16;
bfs();
for(int i = 0; i < m; i ++) {
int a, b;
scanf("%d%d", &a, &b);
int t = lca(a, b);
int ans = dis[a] + dis[b] - dis[t] * 2;
printf("%d\n", ans);
}
return 0;
}
惊醒梦中人
为什么这里面不能用这个代码标记判断
他这儿没有将d数组初始化为INF
可以用这个判断,我两种判断都过了,可能是因为这是个无环图,n个点n - 1条边,bfs更新的结果是一样的
这个操作本质上就是判重
喵阿,直接用深度标识节点访问与否,省去了初始化和遍历邻点时的判断
为什么这里面不能用这个代码标记判断