51nod2621 树上距离一题四解ST表+倍增+Tarjan+树剖
LCA裸题 只有代码无原理,给自己复习用 1. ST表(这题2^10就够了) 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=2e3+50; 5 6 int cnt,dfn[maxn],dep[maxn],dp[maxn][21],lg2[maxn],dis[maxn],w[maxn][maxn]; 7 std::vector<int> G[maxn]; 8 void dfs(int u,int fa){ 9 dis[u]=dis[fa]+w[u][fa]; 10 dfn[u]=++cnt; dep[u]=dep[fa]+1; dp[cnt][0]=u; 11 for(int i=0,v;i<G[u].size();i++){ 12 if((v=G[u][i])==fa) continue; 13 dfs(v,u); 14 dp[++cnt][0]=u; 15 } 16 } 17 void st(){ 18 for(int i=2;i<=cnt;i++) lg2[i]=lg2[i>>1]+1; 19 for(int j=1;j<=20;j++){ 20 for(int i=1;i+(1<<j)-1<=cnt;i++){ 21 int r=i+(1<<(j-1)); 22 dp[i][j] =