调了一个多小时,发现fa[1][]的值居然能影响fa[2][]的值?
查看原帖
调了一个多小时,发现fa[1][]的值居然能影响fa[2][]的值?
339568
TonviaSzt楼主2021/11/16 21:36

调了一个多小时,发现fa[1][]的值居然能影响fa[2][]的值??帮帮孩子吧...

#include<cstdio>
#include<iostream>
using namespace std;
const int N=10+5;
int n,m,s,p[N],dep[N],fa[N][20];
struct node{
    int v,nt;
}E[N<<1];
inline void add(int u,int v){
    E[++p[0]].v=v;
    E[p[0]].nt=p[u];
    p[u]=p[0];
}
void dfs1(int u,int f){
    // printf("u:%d f:%d\n",u,f);
    dep[u]=dep[f]+1;
    for(int i=0;i<=19;i++){
        fa[u][i+1]=fa[fa[u][i]][i];
    }
    for(int i=p[u],v;i;i=E[i].nt){
        if((v=E[i].v)!=f){
            fa[v][0]=u;
            // printf("%d %d\n",v,u);
            dfs1(v,u);
        }
    }
}
int LCA(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    // printf("dep:%d %d\nfa_0:%d %d\n",dep[x],dep[y],fa[x][0],fa[y][0]);
    for(int i=20;i>=0;i--){
        if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
        if(x==y) return x;
    }
    // printf("dep:%d %d\n",dep[x],dep[y]);
    // printf("x:%d y:%d\n",x,y);
    for(int i=20;i>=0;i--){
        // printf("x:%d y:%d\n",x,y);
        if(fa[x][i]!=fa[y][i]){
            x=fa[x][i];
            y=fa[y][i];
        }
    }
    return fa[x][0];
}
int main(){
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<n;i++){
        int x,y;scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs1(s,0);
    while (m--){
        int x,y;scanf("%d%d",&x,&y);
        printf("%d\n",LCA(x,y));
        LCA(x,y);
    }
    return 0;
}
2021/11/16 21:36
加载中...