//树形dp求树的直径 void dfs(int x){ vis[x]=1; for(int i=head[i];i!=-1;i=e[i].nxt){ int v = e[i].v; int w = e[i].w; if(vis[v]) continue; dfs(v); ans = max(ans,dis[u]+dis[v]+w); dis[u] = max(dis[u],dis[v]+w); } } //LCA int f[MAXN][20],d[MAXN],dist[MAXN]; int LOG = (int)(log(n)/log(2)) + 1; void bfs(){//预处理 queue<int> q; q.push(1); d[1]=1; while(!q.empty()){ int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].v; int w=e[i].w; if(d[v]) continue; d[v]=d[u]+1; dist[v]=dist[u]+w; f[v][0]=u; for(int j=1;j<=LOG;++j){ f[v][j]=f[f[v][j-1]][j-1]; } q.push(v); } } } int lca(int u,int v){//回答一个询问 if(d[u]>d[v]) swap(u,v);//让v深度更大 for(int i=LOG;i>=0;--i){ if(d[f[v][i]]>=d[u]) v=f[v][i]; } if(u==v) return u; for(int i=LOG;i>=0;--i){ if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i]; } return f[u][0]; }