求助,树链wa
查看原帖
求助,树链wa
1196460
lawhello楼主2024/9/2 12:52
#include<bits/stdc++.h>
#define maxn 500005
#define INF 0x3f3f3f3f
#define ll long long
int n,m,s;
int head[maxn];
struct Edge{
    int to;
    int next;
}edge[maxn<<1];
int tot=0;
int size[maxn]={0},d[maxn]={0},son[maxn]={0},f[maxn]={0},top[maxn]={0};
void addedge(int u,int v)
{
    edge[++tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot;
}
void dfs1(int x,int fa)
{
    size[x]=1;
    d[x]=d[fa]+1;
    son[x]=0;
    f[x]=fa;//初始化
    for(int i=head[x];~i;i=edge[i].next){
        int to=edge[i].to;
        if(to==fa)continue;
        dfs1(to,x);
        size[x]+=size[to];
        if(size[son[x]]<size[to]) son[x]=to;
    }//遍历子节点,更新信息
}
void dfs2(int x,int topx)//topx记录重链顶端的点
{
    top[x]=topx;
    if(son[x]!=0)dfs2(son[x],topx);
    for(int i=head[x];~i;i=edge[i].next)
    if(edge[i].to!=son[x]&&edge[i].to!=f[x])
    dfs2(edge[i].to,edge[i].to);//遍历轻边,并为其创建新的重链
}
void lca(int u,int v)
{
    while(top[u]!=top[v])
    {
        if(d[u]>=d[v])u=f[top[u]];//深度越大代表点靠近底部
        else v=f[top[v]];
    }
    printf("%d\n",d[u]<d[v]?u:v);
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<=n;i++)
    head[i]=-1;
    for(int i=1;i<=n-1;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        addedge(u,v);
        addedge(v,u);
    }
    dfs1(s,s);
    dfs2(s,s);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        lca(u,v);
    }
}
2024/9/2 12:52
加载中...