LCA倍增算法求问
  • 板块灌水区
  • 楼主jiapuludeng
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/20 14:24
  • 上次更新2023/11/2 12:34:37
查看原帖
LCA倍增算法求问
902004
jiapuludeng楼主2023/10/20 14:24
#include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>
#include <cstring>
using namespace std;
int h[10050],ne[20050],e[20050],deep[10050],dp[10050][20],fa[10050];
int sidecnt = 0;
void reset()
{
    memset(h,0,sizeof(h));
    memset(deep,0,sizeof(deep));
    memset(ne,0,sizeof(ne));
    memset(e,0,sizeof(e));
    memset(fa,0,sizeof(fa));
    sidecnt = 0;
}
void add(int a,int b)
{
     sidecnt++;
     ne[sidecnt] = h[a];
     e[sidecnt] = b;
     h[a] = sidecnt;
}
void dfs(int x)
{
    dp[x][0] = fa[x];
    for(int i = 1;i <= 20;i++) dp[x][i] = dp[dp[x][i-1]][i-1];
    for(int u = h[x];u != 0;u = ne[u])
    {
        int v = e[u];
        if(v == fa[x]) continue;
        fa[v] = x;
        deep[v] = deep[x] + 1;
        dfs(v);
    }
}
int lca(int x,int y)
{
    if(deep[x] < deep[y]) swap(x,y);
    for(int i = 20;i >= 0;i--) if(deep[dp[x][i]] > deep[y]) x = dp[x][i];
    if(x == y) return y;
    for(int i = 20;i >= 0;i--)
    {
        if(dp[x][i] != dp[y][i])
        {
            x = dp[x][i];
            y = dp[y][i];
        }
    }
    return fa[x];
}
int main()
{
    int n,numsum,a,b;
    cin >> n;
    for(int i = 1;i <= n;i++)
    {
        reset();
        cin >> numsum;
        for(int i = 1;i <= numsum - 1;i++)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
        }
        fa[numsum] = numsum;
        deep[numsum] = 0;
        dfs(numsum);
        cin >> a >> b;
        cout << lca(a,b) << endl;
    } 
    return 0;
}

请问这段代码中dfs函数中dp数组的维护方式

2023/10/20 14:24
加载中...