VS上调试样例正确但是WA,求调
查看原帖
VS上调试样例正确但是WA,求调
918238
littleSharkforest楼主2023/4/5 15:09
#include<bits/stdc++.h>
using namespace std;
const int K = 500010;
const int T = K*2;
int e[K],h[T],ne[T],idx;
int depth[K],fa[K][19],q[K];
void add(int a,int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}
void bfs(int root)
{
    memset(depth,0x3f,sizeof depth);
    depth[0] = 0;
    depth[root] = 1;
    int hh = 0;
    int tt = 0;
    q[0] = root;
    while(hh<=tt)
    {
        int t = q[hh++];
        for(int i = h[t];i>=0;i = ne[i])
        {
            int j = e[i];
            if(depth[j]>depth[t]+1)
            {
                depth[j] = depth[t]+1;
                q[++tt] = j;
                fa[j][0] = t;
                for(int k = 1;k<=19;k++)
                    fa[j][k] = fa[fa[j][k-1]][k-1];
            }
        }
    }
}
int lca(int a,int b)
{
    if(depth[a]<depth[b])   swap(a,b);
    for(int k = 18;k>=0;k--)
        if(depth[fa[a][k]]>=depth[b])   a = fa[a][k];
    if(a==b)    return a;
    for(int k = 18;k>=0;k--)
    {
        if(fa[a][k]!=fa[b][k])
        {
            a = fa[a][k];
            b = fa[b][k];
        }
    }
    return fa[a][0];
}
int main()
{
    int N,M,S;
    cin>>N>>M>>S;
    memset(h,-1,sizeof h);
    for(int i = 0;i<N-1;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    bfs(S);
    while(M--)
    {
        int a,b;
        cin>>a>>b;
        cout<<lca(a,b)<<endl;
    }
    return 0;
}
2023/4/5 15:09
加载中...