Lca.
3 points respectively LCA, you can know, depth of the most profound LCA is the answer.
#include <cstdio>#include<algorithm>#include<cstring>using namespacestd;Const intMAXN =500000+Ten;Const intMAXM =1000000+Ten;Const intMAXL = A;intG[maxn],v[maxm],next[maxm],eid;intANC[MAXN][MAXL],H[MAXN];intQ[MAXN];inta,b,c,n,m;voidAddedge (intAintb) {V[eid]=b; Next[eid]=g[a]; g[a]=eid++; V[eid]=a; NEXT[EID]=G[B]; g[b]=eid++;}voidbuild () {scanf ("%d%d",&n,&m); Memset (g,-1,sizeof(g)); for(intI=1, u,v;i<n;i++) {scanf ("%d%d",&u,&v); Addedge (U,V); } }voidBFs () {intL,r,u; L=r=0; h[1]=1; q[r++]=1; anc[1][0]=1; while(l<r) {u=q[l++]; for(intI=g[u];~i;i=next[i])if(v[i]!=anc[u][0]) {anc[v[i]][0]=u; Q[r++]=V[i]; H[v[i]]=h[u]+1; } }}voidUpint&a,intH) { for(inti=maxl-1; i>=0; i--) if(h[anc[a][i]]>=h) a=anc[a][i];}intLCA (intAintb) {if(h[a]!=H[b]) { if(h[a]>H[b]) up (a,h[b]); ElseUp (B,h[a]); } if(a==b)returnA; for(intl=maxl-1; l>=0; l--) if(anc[a][l]!=Anc[b][l]) {a=Anc[a][l]; b=Anc[b][l]; } returnanc[a][0];}intDisintAintb) {intp=LCA (A, b); returnh[a]+h[b]-2*h[p];}voidsolve () { for(intI=1; i<=m;i++) { intp,p1,p2,p3; scanf ("%d%d%d",&a,&b,&b); P1=lca (A, B), P2=lca (a,c), p3=LCA (B,C); if(P1==P2) p=P3; Else if(P1==P3) p=P2; Elsep=P1; printf ("%d%d\n", P,dis (p,a) +dis (p,b) +dis (p,c)); }}voidPredo () {BFS (); for(intI=1; i<maxl;i++) for(intu=1; u<=n;u++) Anc[u][i]=anc[anc[u][i-1]][i-1];}intMain () {build (); Predo (); Solve (); return 0;}
bzoj1787: [Ahoi2008]meet Emergency collection