1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| struct edge{ int v,w; };
vector<edge>e[N]; int dep[N]; int d[N]; const int len=__lg(N); int f[N][len+2]; int cnt[N]; int ans=0; void dfs(int u,int fa){ dep[u]=dep[fa]+1; f[u][0]=fa; for(int i=1;i<=len;i++)f[u][i]=f[f[u][i-1]][i-1];
for(auto [v,w]:e[u]){ if(v==fa)continue; d[v]=d[u]+w; dfs(v,u); } }
int lca(int x,int y){ if(dep[x]<dep[y])swap(x,y); for(int i=len;i>=0;i--){ if(dep[f[x][i]]>=dep[y])x=f[x][i]; }
if(x==y)return y;
for(int i=len;i>=0;i--){ if(f[x][i]!=f[y][i]){ x=f[x][i];y=f[y][i]; } } return f[x][0]; }
|