为啥错了 求调
查看原帖
为啥错了 求调
492281
longerfu楼主2024/10/23 15:10

实在看不出哪里错了

#include <iostream>
#include <cstring>
using namespace std;

int dep[500005];
int fa[500005][22];
struct node{
    int to,nxt;
};
int cnt;
node e[500005];
int head[500005];
void add(int u,int v)
{
    e[cnt++].to = v;
    e[cnt].nxt = head[u];
    head[u] = cnt;
}
const int k = 20; 
int n,m,s;
void dfs(int u,int father)
{
    dep[u] = dep[father] + 1;
    fa[u][0] = father;
    for(int i=1;i<=k;i++)
    {
        fa[u][i] = fa[fa[u][i-1]][i-1]; 
    }
    for(int i=head[u];~i;i=e[i].nxt)
    {
        int v = e[i].to;
        if(v!=father)
        {
            dfs(v,u);
        }
    }
}

int LCA(int u,int v)
{
    if(dep[u]<dep[v])   
        swap(u,v);
    for(int i = k;i>=0;i--)
    {
        if(dep[v]<=dep[fa[u][i]])
            u = fa[u][i];
    }
    if(u==v)
    {
        return v;
    } 
    for(int i=k;i>=0;i--)
    {
        if(fa[u][i]!=fa[v][i])
        {
             u = fa[u][i];
             v = fa[v][i];
        }  
    }
    return fa[u][0];
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>s;
    memset(head,-1,sizeof(head));
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(s,0);
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        cout<<LCA(a,b)<<endl;
    }
    return 0;
}
2024/10/23 15:10
加载中...