1 条题解
-
0

#include<bits/stdc++.h> using namespace std; const int N=1e5+10; vector<pair<int,int>>G[N]; int D,dep[N],st[N][20],dis[N]; void dfs(int x,int xfa) { dep[x]=dep[xfa]+1; st[x][0]=xfa;for(int i=1;i<=D;i++)st[x][i]=st[st[x][i-1]][i-1]; for(auto i:G[x])if(i.first!=xfa) { int y=i.first,w=i.second; dis[y]=dis[x]+w; dfs(y,x); } } int LCA(int x,int y) { if(dep[x]<dep[y])swap(x,y); for(int i=D;i>=0;i--)if(dep[st[x][i]]>=dep[y])x=st[x][i]; if(x==y) return x; for(int i=D;i>=0;i--)if(st[x][i]!=st[y][i])x=st[x][i],y=st[y][i]; return st[x][0]; } int main() { int n,m;scanf("%d%d",&n,&m); for(int i=1,x,y,w;i<n;i++) { scanf("%d%d%d",&x,&y,&w); G[x].push_back({y,w}); G[y].push_back({x,w}); } D=log2(n);memset(dep,0,sizeof(dep));memset(st,0,sizeof(st));memset(dis,0,sizeof(dis)); dfs(1,0); for(int i=1,x,y;i<=m;i++) { scanf("%d%d",&x,&y); printf("%d\n",dis[x]+dis[y]-2*dis[LCA(x,y)]); } return 0; }
- 1
信息
- ID
- 462
- 时间
- 200ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 321
- 已通过
- 66
- 上传者