看了很久没看出来怎么回事,求助。
代码:
#include<iostream>
#include<vector>
using namespace std;
int n;
//cpnst int maxn
const int maxn=105;
int d[maxn],c[maxn],f[maxn][10];
vector<int> G[maxn];
int dp=0;
void dfs(int root,int fa){
d[root]=d[fa]+1;
c[d[root]]++;
f[root][0]=fa;
for (int i=1;(1<<i)<=d[root];i++){
f[root][i]=f[f[root][i-1]][i-1];
}
//dp=max(dp,d[root]);
for(auto i:G[root]){
if(i!=fa) dfs(i,root);
}
}
int lca(int x,int y){
if(d[x]<d[y]){
//d[x]=d[y];
swap(x,y);
}
for(int j=10;j>=0;j--){
if(d[f[x][j]]>=d[y]){
x=f[x][j];
//cout<<x<<" "<<y<<endl;
}
}
if(x==y) return x;
for(int j=10;j>=0;j--){
if(f[x][j]!=f[y][j]){
x=f[x][j];
y=f[y][j];
}
}
return f[x][0];
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
//fa[y]=x;
}
int u,v;
cin>>u>>v;
dfs(1,0);
for(int i=1;i<=n;i++){
dp=max(dp,d[i]);
}
//cout<<endl;
cout<<dp<<endl;
dp=0;
for(int i=1;i<=n;i++){
dp=max(dp,c[i]);
}
cout<<dp<<endl;
//for(int )
int fa=lca(u,v);
//cout<<fa<<endl;
cout<<2*(d[u]-d[fa])+d[v]-d[fa]<<endl;
return 0;
}
就是倍增求LCA。 求大佬帮忙,蒟蒻感激涕零