dalao们,能帮我看下哪里错了吗QAQ我用的是树上倍增
查看原帖
dalao们,能帮我看下哪里错了吗QAQ我用的是树上倍增
672737
liuguangyuan楼主2022/1/24 22:35

就是很迷幻,LCA函数找公共祖先的时候,竟然能出祖先为0.。。。。。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
bool vis[maxn];
int deep[maxn];
int F[500005][20];
int n,m,s;
struct Edge
{
    int from,to;
};
vector<Edge>edges;
vector<int>G[maxn];
void add(int from,int to)
{
    edges.push_back({from,to});
    int m=edges.size();
    G[from].push_back(m-1);
}

void dfs(int u)
{
    vis[u]=true;
    for(int i=0;i<G[u].size();i++)
    {
        Edge e=edges[G[u][i]];
        int v=e.to;
        if(vis[v])
            continue;
        deep[v]=deep[u]+1;
        F[v][0]=u;
        dfs(v);
    }
}

void ST()
{
    for(int j=1;j<=20;j++)
    {
        for(int i=1;i<=n;i++)
            F[i][j]=F[F[i][j-1]][j-1];
    }
}

int LCA(int x,int y)
{
    if(deep[x]>deep[y])
        swap(x,y);
    //cout<<x<<"    "<<y<<endl;
    for(int i=20;i>=0;i--)
    {
        if(deep[F[y][i]]>=deep[x])
            y=F[y][i];
    }
    //cout<<x<<"    "<<y<<endl;
    if(x==y)
        return x;
    for(int i=20;i>=0;i--)
    {
        if(F[x][i]!=F[y][i])
        {
            x=F[x][i];
            y=F[y][i];
        }
    }
   // cout<<x<<endl;
    return F[x][0];
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    memset(vis,false,sizeof(vis));

    cin>>n>>m>>s;
    for(int i=0;i<n-1;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    deep[s]=0;
    dfs(s);
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        cout<<LCA(a,b)<<endl;
    }
}

2022/1/24 22:35
加载中...