luogu P3884 [JLOI2009]二叉树问题 题解

Posted misakaazusa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P3884 [JLOI2009]二叉树问题 题解相关的知识,希望对你有一定的参考价值。

题目链接:https://www.luogu.org/problemnew/show/P3884
对方不想和你说话并向你扔了一个lca模板。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxlog = 10;
const int maxn = 105;
int n, m, s, widans = -1, depans = -1;
int root;
int fa[maxn][maxlog];
int deep[maxn], wide[maxn];
int head[maxn];
int cnt;
struct Edge{
    int next;
    int to;
}e[maxn<<2];
void add(int u, int v)
{
    e[cnt].to = v;
    e[cnt].next = head[u];
    head[u] = cnt++;
}
void dfs(int u, int p, int d)
{
    fa[u][0] = p;
    deep[u] = d;
    for(int i = head[u]; i != -1; i = e[i].next)
        if(e[i].to != p) dfs(e[i].to, u, d+1);
}
void init()
{
    dfs (root, -1, 0);
    for(int k = 0; k + 1 < maxlog; k++)
    {
        for(int v = 1; v <= n; v++)
        if(fa[v][k] < 0) fa[v][k+1] = -1;
        else fa[v][k+1] = fa[fa[v][k]][k];
    }
}
int lca(int u, int v)
{
    if(deep[u] > deep[v]) swap(u, v);
    for(int k = 0; k < maxlog; k++)
    {
        if(deep[v] == deep[u]) break;
        if((deep[v] - deep[u]) >> k & 1)
        {
            v = fa[v][k];
        }
    }
    
    if(u == v) return u;

    for(int k = maxlog - 1; k >= 0; k--)
    {
        if(fa[v][k] != fa[u][k])
        {
            u = fa[u][k];
            v = fa[v][k];
        }
    }
    return fa[u][0];
}
int main()
{
    memset(head,-1,sizeof(head)); 
    int a,b;
    scanf("%d",&n);
    for(int i = 1; i < n; i++)
    {
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    root = 1; 
    init();
    for(int i = 1; i <= n; i++)
    {
        depans = max(depans, deep[i]);
        wide[deep[i]]++;
    }
    int u, v;
    scanf("%d%d",&u,&v);
    int p = lca(u,v);
    for(int i = 0; i <= depans; i++)
    {
        widans = max(widans, wide[i]);
    }
    printf("%d
%d
%d",depans+1,widans,2*(deep[u]-deep[p])+deep[v]-deep[p]);
    
    return 0;    
}

哇我lca是真菜。

以上是关于luogu P3884 [JLOI2009]二叉树问题 题解的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P3884 [JLOI2009]二叉树问题

Luogu1185 | 绘制二叉树(分治)

[luogu p5018] 对称二叉树

Luogu P1305 新二叉树

luogu1040加分二叉树

luogu1040 加分二叉树