题目:
分析:结点u到结点v间距离。数据量比较小,不需要倍增(最近公共祖先)。
代码:
#include<bits/stdc++.h>
using namespace std;
vector<vector<int> > vv;
int m;
int fa[105];
int max_depth=0;
int depth[105];
void ddepth(int x,int dep)
{
depth[x]=dep;
max_depth=max(max_depth,dep);
for(int i=0;i<vv[x].size();i++) ddepth(vv[x][i],dep+1);
}
int main()
{
vector<int> v;
cin>>m;
for(int i=0;i<=m;i++) vv.push_back(v);
for(int i=1;i<m;i++)
{
int a,b;
cin>>a>>b;
vv[a].push_back(b);
fa[b]=a;
}
ddepth(1,1);
cout<<max_depth<<endl;
queue<int> q;
q.push(1);
int maxx=1;
while(!q.empty())
{
queue<int> qq;
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=0;i<vv[t].size();i++) qq.push(vv[t][i]);
}
int q_size=qq.size();
maxx=max(maxx,q_size);
q=qq;
}
cout<<maxx<<endl;
int a1,a2,a3;
cin>>a1>>a2;
int aa1=a1;
int aa2=a2;
int dis=0;
if(depth[a1]>=depth[a2])
{
while(1)
{
if(depth[a1]==depth[a2]) break;
a1=fa[a1];
dis++;dis++;
}
while(1)
{
if(a1==a2)
{
a3=a1;break;
}
a1=fa[a1];
a2=fa[a2];
dis++;
dis++;
dis++;
}
cout<<dis;
}
else{
while(1)
{
if(depth[a1]==depth[a2]) break;
a2=fa[a2];
dis++;
}
while(1)
{
if(a1==a2)
{
a3=a1;break;
}
a1=fa[a1];
a2=fa[a2];
dis++;
dis++;
dis++;
}
cout<<dis;
}
}