【LOJ 10134】Dis
题解:就LCA加上个边权值,不是很难哦
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<bits/stdc++.h> using namespace std; const int N=500002; typedef long long ll; struct node{ int next; int to; int val; }e[N*2]; int n,m,t,z,x,y,a,b,c,d[N],f[N][22]; int cnt,head[N],we[N]; void add(int x,int y,int z){ e[++cnt].to=y; e[cnt].next=head[x]; e[cnt].val=z; head[x]=cnt; } void dfs(int u,int fa){ d[u]=d[fa]+1; for(int i=0;i<=19;i++) f[u][i+1]=f[f[u][i]][i]; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v==fa) continue; we[v]=we[u]+e[i].val; f[v][0]=u; dfs(v,u); } } int lca(int x,int y){ if(d[x]<d[y]) swap(x,y); for(int i=20;i>=0;i--){ if(d[f[x][i]]>=d[y]) x=f[x][i]; if(x==y) return x; } for(int i=20;i>=0;i--) if(f[x][i]!=f[y][i]) { x=f[x][i]; y=f[y][i]; } return f[x][0]; } int main(){ freopen("10134.in","r",stdin); freopen("10134.out","w",stdout); scanf("%d %d",&n,&m); for(int i=1;i<n;i++){ scanf("%d %d %d",&x,&y,&z); add(x,y,z); add(y,x,z); } dfs(1,0); for(int i=1;i<=m;i++){ scanf("%d %d",&x,&y); printf("%d\n",we[x]+we[y]-2*we[lca(x,y)]); } return 0; }