LCA 10pts 求条
查看原帖
LCA 10pts 求条
920406
违规用户名920406楼主2024/12/17 10:52

输出:4 0 0 0 4

#include <iostream>
#include <vector>
using namespace std;
const int N=1e5+1;
int n,m,r,p,f,t,x,y,tim,a[N],fa[N],in[N],out[N],dep[N],siz[N],hson[N],belong[N];
vector<int> son[N];
void dfs(int i,int f)
{
    fa[i]=f;
    siz[i]=1;
    dep[i]=dep[f]+1;
    for(auto x:son[i])
        if(x!=f)
        {
            dfs(x,i);
            siz[i]+=siz[x];
            if(siz[hson[i]]<siz[x]) hson[i]=x;
        }
}
void dfs2(int i,int op)
{
    if(!op) belong[i]=i;
    else    belong[i]=belong[fa[i]];
    in[i]=++tim;
    if(hson[i]) dfs2(hson[i],1);
    for(auto x:son[i])
        if(x!=fa[i]&&x!=hson[i])
            dfs2(x,0);
    out[i]=++tim;
}
int lca(int x,int y)
{
    while(belong[x]!=belong[y])
    {
        if(dep[x]<dep[y])   swap(x,y);
        x=fa[belong[x]];
    }
    if(dep[x]<dep[y])   return x;
    return y;
}
int main()
{
    cin>>n>>m>>r/*>>p*/;
//  for(int i=1;i<=n;i++)   cin>>a[i];
    for(int i=1;i<n;i++)
    {
        cin>>f>>t;
        son[f].push_back(t);
        son[t].push_back(f);
    }
    dfs(r,0);
    dfs2(r,0);
//    for(int i=1;i<=n;i++)
//    {
//        for(auto x:son[i])  cout<<x<<' ';
//        cout<<endl;
//    }
//    cout<<endl;
//    cout<<"fa : ";for(int i=1;i<=n;i++)cout<<fa[i]<<' ';cout<<'\n';
//    cout<<"siz : ";for(int i=1;i<=n;i++)cout<<siz[i]<<' ';cout<<'\n';
//    cout<<"dep : ";for(int i=1;i<=n;i++)cout<<dep[i]<<' ';cout<<'\n';
//    cout<<"hson : ";for(int i=1;i<=n;i++)cout<<hson[i]<<' ';cout<<'\n';
//    cout<<"belong : ";for(int i=1;i<=n;i++)cout<<belong[i]<<' ';cout<<'\n';
//    cout<<"in : ";for(int i=1;i<=n;i++)cout<<in[i]<<' ';cout<<'\n';
//    cout<<"out : ";for(int i=1;i<=n;i++)cout<<out[i]<<' ';
    while(m--)
    {
        cin>>x>>y;
        cout<<lca(x,y)<<'\n';
    }
    return 0;
}
2024/12/17 10:52
加载中...