核心:
2 利用 dep工具 ,将2个点放到一个深度 然后同时向上爬
1 通过倍增法 利用 2进制模式 快速向上爬,来查到到最想要的那个数据。
void dfs(int a,int ba) { vis[a]=1;dep[a]=ba; for(ri i=0;i<p[a].size();i++) { int b=p[a][i]; if(vis[b]) continue; fa[b][0]=a; for(ri i=1;i<20;i++) { fa[b][i]=fa[fa[b][i-1]][i-1]; } dfs(b,ba+1); } } int ck(int a,int b) { if(dep[a]<dep[b]) swap(a,b); for(ri i=20;i>=0;i--) { if(dep[fa[a][i]]>=dep[b]) { a=fa[a][i]; } } if(a==b) return b; for(ri i=20;i>=0;i--) { if(fa[a][i]!=fa[b][i]) a=fa[a][i],b=fa[b][i]; } return fa[a][0]; }