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;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14522351.html