P3884 [JLOI2009]二叉树问题
数据范围小,用的暴力搜索法。
同步前进法。
const int N=110;
int fa[N];
int dep[N],width[N];
int maxh,maxw;
int n;
int LCA(int u,int v)
{
if(dep[u] < dep[v]) swap(u,v);
while(dep[u] != dep[v]) u=fa[u];
if(u == v) return v;
while(fa[u] != fa[v])
{
u=fa[u];
v=fa[v];
}
return fa[u];
}
int main()
{
cin>>n;
dep[1]=1;
width[1]=1;
for(int i=0;i<n-1;i++)
{
int u,v;
cin>>u>>v;
fa[v]=u;
dep[v]=dep[u]+1;
width[dep[v]]++;
maxh=max(maxh,dep[v]);
maxw=max(maxw,width[dep[v]]);
}
cout<<maxh<<endl<<maxw<<endl;
int u,v;
cin>>u>>v;
int lca=LCA(u,v);
cout<<(dep[u]-dep[lca])*2+dep[v]-dep[lca]<<endl;
//system("pause");
return 0;
}
向上标记法。
const int N=110;
int fa[N];
int dep[N],width[N];
bool vis[N];
int maxh,maxw;
int n;
int LCA(int u,int v)
{
vis[u]=true;
while(fa[u])
{
u=fa[u];
vis[u]=true;
}
while(!vis[v])
{
v=fa[v];
}
return v;
}
int main()
{
cin>>n;
dep[1]=1;
width[1]=1;
for(int i=0;i<n-1;i++)
{
int u,v;
cin>>u>>v;
fa[v]=u;
dep[v]=dep[u]+1;
width[dep[v]]++;
maxh=max(maxh,dep[v]);
maxw=max(maxw,width[dep[v]]);
}
cout<<maxh<<endl<<maxw<<endl;
int u,v;
cin>>u>>v;
int lca=LCA(u,v);
cout<<(dep[u]-dep[lca])*2+dep[v]-dep[lca]<<endl;
//system("pause");
return 0;
}