How far away ?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9683 Accepted Submission(s): 3411
Problem Description
There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it hard to answer. But luckily int this village the answer is always unique, since the roads are built in the way that there is a unique simple path("simple" means you can't visit a place twice) between every two houses. Yout task is to answer all these curious people.
Input
First line is a single integer T(T<=10), indicating the number of test cases.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
Output
For each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.
Sample Input
2 3 2 1 2 10 3 1 15 1 2 2 3 2 2 1 2 100 1 2 2 1
Sample Output
10 25 100 100#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <algorithm> #define ll long long using namespace std; const int MAXN = 40000 + 10; struct Edge{int to, next, w;} edge[MAXN<<1]; int tot, head[MAXN], bin[30]; int id[MAXN], fa[MAXN][30], dis[MAXN], dep[MAXN], u, v, w, n, q, dfs_clock, pos[MAXN]; void init(){tot = 0, memset(head, -1, sizeof(head));} void addedge(int u, int v, int w) {edge[tot].to = v; edge[tot].w = w; edge[tot].next = head[u]; head[u] = tot++;} void dfs(int x) { id[x] = ++dfs_clock; pos[dfs_clock] = x; for(int i=1;bin[i] <= dep[x]; i++) fa[x][i] = fa[fa[x][i-1]][i-1]; for(int i=head[x];i!=-1;i=edge[i].next) if(edge[i].to != fa[x][0]) { dep[edge[i].to] = dep[x] + 1; dis[edge[i].to] = dis[x] + edge[i].w; fa[edge[i].to][0] = x; dfs(edge[i].to); } } int lca(int x, int y) { if(dep[x] > dep[y]) swap(x, y); int t = dep[y] - dep[x]; for(int i=0;bin[i]<=t;i++) if(bin[i] & t) y = fa[y][i]; for(int i=16;i>=0;i--) if(fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i]; return x == y ? x : fa[x][0]; } int main() { bin[0] = 1; for(int i=1;i<30;i++) bin[i] = bin[i-1] << 1; int T;scanf("%d", &T); while(T--) { scanf("%d%d", &n, &q); init(); for(int i=1;i<n;i++) { scanf("%d%d%d", &u, &v, &w); addedge(u, v, w); addedge(v, u, w); } dfs(1); while(q--) { scanf("%d%d", &u, &v); int fa = lca(u, v); int ans = dis[u] - dis[fa] + dis[v] - dis[fa]; printf("%d\n", ans); } //printf("\n"); } return 0; }