题目
思路
一道模板题,没啥好说的,直接见代码
代码
#include <bits/stdc++.h>
using namespace std;
int n,q,a,to[100001][22],b,deep[100001],c,t[1000001];
struct ff
{int id,len;
};
vector<ff> vec[100001];
void dfs(int x,int fa,int dp,int now)//now是x的深度(不计边权,根的深度计为1) dp是x距离根节点的距离(计边权)
{deep[x] = now;//单独开now变量是因为边权并不影响lca的值t[x] = dp;to[x][0] = fa;for(int i = 0;i < vec[x].size();i++)if(vec[x][i].id != fa)dfs(vec[x][i].id,x,dp + vec[x][i].len,now + 1);
}
int lca(int x,int y)
{if(deep[x] < deep[y]) swap(x,y);for(int i = 21;i >= 0;i--)if(deep[to[x][i]] >= deep[y])x = to[x][i];if(x == y) return x;for(int i = 21;i >= 0;i--)if(to[x][i] != to[y][i]){x = to[x][i];y = to[y][i];}return to[x][0];
}
int main()
{cin>>n>>q;for(int i = 1;i < n;i++){scanf("%d%d%d",&a,&b,&c);vec[a].push_back({b,c});vec[b].push_back({a,c});}dfs(1,0,0,1);for(int i = 1;i <= 21;i++)for(int j = 1;j <= n;j++)to[j][i] = to[to[j][i - 1]][i - 1]; while(q--){scanf("%d%d",&a,&b);int k = lca(a,b);printf("%d\n",t[a] + t[b] - 2 * t[k]);//a的深度-lca(a,b)的深度就是a到lca(a,b)的距离,b的深度-lca(a,b)的深度就是b到lca(a,b)的距离//加起来就是a到b的距离(因为a->b的路径必定会经过lca(a,b))}return 0;
}
结语
如果这篇文章对您要帮助的话,请点赞支持一下吖! <(^-^)>