全部评论 2

  • #include <iostream>
    #include <vector>
    using namespace std;
    constexpr int N = 4e4 + 10;
    class node {
    public:
    	int to, w;
    };
    vector<node> tr[N];
    int deep[N], fa[N][25];
    long long dist[N];
    int n, m;
    void dfs(int u, int p) {
    	fa[u][0] = p;
    	for (int i = 1; i < 20; i++) {
    		fa[u][i] = fa[fa[u][i - 1]][i - 1];
    	}
    	for (auto e : tr[u]) {
    		int v = e.to, w = e.w;
    		if (v == p) {
    			continue;
    		}
    		deep[v] = deep[u] + 1;
    		dist[v] = dist[u] + w;
    		dfs(v, u);
    	}
    }
    int lca(int u, int v) {
    	if (deep[u] < deep[v]) {
    		swap(u, v);
    	}
    	int diff = deep[u] - deep[v];
    	for (int i = 0; i < 20; i++) {
    		if (diff & (1 << i)) {
    			u = fa[u][i];
    		}
    	}
    	if (u == v) {
    		return u;
    	}
    	for (int i = 20 - 1; i >= 0; i--) {
    		if (fa[u][i] != fa[v][i]) {
    			u = fa[u][i];
    			v = fa[v][i];
    		}
    	}
    	return fa[u][0];
    }
    void solve() {
    	cin >> n >> m;
    	for (int i = 1; i <= n; i++) {
    		tr[i].clear();
    	}
    	for (int i = 1; i < n; i++) {
    		int u, v, w;
    		cin >> u >> v >> w;
    		tr[u].push_back({ v, w });
    		tr[v].push_back({ u, w });
    	}
    	deep[1] = 1;
    	dist[1] = 0;
    	dfs(1, 0);
    	while (m--) {
    		int u, v;
    		cin >> u >> v;
    		int p = lca(u, v);
    		cout << dist[u] + dist[v] - 2 * dist[p] << '\n';
    	}
    	cout << '\n';
    }
    int main() {
    	int t;
    	cin >> t;
    	while (t--) {
    		solve();
    	}
    	return 0;
    }
    

    昨天 来自 广东

    0

热门讨论