代码如下:
#include<iostream>
using namespace std;
struct node{
int fa,ls,rs,rank;
explicit node(int _fa=0,int _ls=0,int _rs=0,int _rank=1):fa(_fa),ls(_ls),rs(_rs),rank(_rank){}
};
class tree{
private:
int now_size,max_rank=-1;
node* nodes;
public:
explicit tree(const int& size):LCA(0),now_size(size+1),nodes(new node[size+1]){}
~tree(){delete[] nodes;}
/*void dfs(const int& index,int rank=1){
if(not index)return;
max_rank=max(max_rank,rank);
dfs(nodes[index].ls,rank+1);
dfs(nodes[index].rs,rank+1);
}*/
void rank(const int& from,const int& to,const int& deep=1){
if(from==to or not from)return;
nodes[from].rank=deep;
rank(nodes[from].ls,to,deep+1);
rank(nodes[from].rs,to,deep+1);
}
node& operator[](const size_t& index){
return nodes[index];
}
int width(){
int cnt[max_rank+1];
for(int i=0;i<max_rank+1;i++)cnt[i]=0;
int max_width=0;
for(int i=1;i<now_size;i++)cnt[nodes[i].rank]++;
for(int i=1;i<max_rank+1;i++)max_width=max(max_width,cnt[i]);
return max_width;
}
int depth()const{
return max_rank;
}
int LCA;
void lca(int u,int v){
if(u==v){
LCA=u;
return;
}
if(nodes[u].rank>nodes[v].rank)
for(int i=0;i<u-v;i++)u=nodes[u].fa;
else if(nodes[v].rank>nodes[u].rank)
for(int i=0;i<v-u;i++)v=nodes[v].fa;
if(u==v){
LCA=u;
return;
}
lca(nodes[u].fa,nodes[v].fa);
}
int dis(int u,int v){
lca(u,v);
return (nodes[u].rank-nodes[LCA].rank)*2+nodes[v].rank-nodes[LCA].rank;
}
void ope(){
for(int i=1;i<now_size;i++)max_rank=max(max_rank,nodes[i].rank);
}
};
int n,u,v;
void input(tree& TREE){
int fa,s,lfa=-1,ls=-1;
for(int i=1;i<n;i++){
cin>>fa>>s;
if(lfa==fa)
TREE[ls].fa=fa,
TREE[s].fa=fa,
TREE[fa].ls=ls,
TREE[fa].rs=s;
else
TREE[s].fa=fa,
TREE[fa].ls=s;
lfa=fa;
ls=s;
}
}
int main(){
cin>>n;
tree Tree(n);
input(Tree);
cin>>u>>v;
for(int i=2;i<=n;i++)Tree.rank(1,i);
Tree.ope();
//for(int i=1;i<=n;i++)cout<<i<<":"<<Tree[i].fa<<' '<<Tree[i].ls<<' '<<Tree[i].rs<<' '<<Tree[i].rank<<endl;
cout<<Tree.depth()<<endl<<Tree.width()<<endl<<Tree.dis(u,v);
return 0;
}