社区讨论

求dalao看倍增板子哪里打错了……马上noip很慌啊

P3379【模板】最近公共祖先(LCA)参与者 6已保存回复 19

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
19 条
当前快照
1 份
快照标识符
@mi6mbtg3
此快照首次捕获于
2025/11/20 07:13
4 个月前
此快照最后确认于
2025/11/20 07:29
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int dep[1000001];
vector<int> g[1000001];
int n,m,s;
int an[1000001][30];
void dfs(int x,int fa)
{
    dep[x]=dep[fa]+1;
    an[x][0]=fa;
    vector<int>::iterator j;
    for (j=g[x].begin();j!=g[x].end();j++) 
    {
        int temp=*j;
        if (temp!=fa) dfs(temp,x);
    }
    return ;
}
void init()
{
    for (int i=1;i<=20;i++) 
    {
        for (int k=n;k>=1;k--) 
        {
            an[k][i]=an[an[k][i-1]][i-1];
        }
    }
}
int lca(int u,int v)
{
    //cout<<dep[u]<<' '<<dep[v]<<endl;
    if (dep[u]<dep[v]) swap(u,v);
    if (dep[u]!=dep[v])
    {
        for (int i=20;i>=0;i--)
        {
            if (dep[an[u][i]]>=dep[v]) 
            {
                u=an[u][i];
            }
        }
    }
    //cout<<u<<' '<<v<<endl;
    for (int i=20;i>=0;i--)
    {
        if (an[u][i]!=an[v][i]) 
        {
            u=an[u][i];
            v=an[v][i];
        }
    }
    return an[u][0];
}
int main()
{
    cin>>n>>m>>s;
    for (int i=1;i<=n-1;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if (an[y][0]!=0) swap(x,y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(s,0);
    an[s][0]=s;
    //for (int i=1;i<=n;i++) cout<<an[i][0]<<' '; 
    init();
    for (int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    return 0;
}

回复

19 条回复,欢迎继续交流。

正在加载回复...