关于LCA,脑子不太好使,萌新问个问题。
查看原帖
关于LCA,脑子不太好使,萌新问个问题。
434015
Calanosay楼主2021/3/25 22:06
#include<bits/stdc++.h>
using namespace std;
const int N=500001;
int dep[N],fa[N][22],tot;
vector<int>vec[N];
void dfs(int u,int father) {
    dep[u]=dep[father]+1;
    fa[u][0]=father;
    for(int i=1; (1<<i)<=dep[u]; i++)fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int i=0; i<vec[u].size(); i++)if(father!=vec[u][i]) dfs(vec[u][i],u);
}
int lca(int x,int y) {
    if(dep[x]<dep[y])swap(x,y);//令x深于y
    while(dep[x]!=dep[y])x=fa[x][(int)log2(dep[x]-dep[y])];
    if(x==y)return x;
    for(int k=log2(dep[x]); k>=0; k--)
        if(fa[x][k]!=fa[y][k])x=fa[x][k],y=fa[y][k];
    return fa[x][0];
}
int n,m,s,x,y;
int main() {
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1; i<=n-1; i++) {
        scanf("%d%d",&x,&y);
        vec[x].push_back(y);
        vec[y].push_back(x);
    }
    dfs(s,0);
    for(int i=1; i<=m; i++) {
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
}

LCA算法中lca函数这个倒数第三行

    for(int k=log2(dep[x]); k>=0; k--)
        if(fa[x][k]!=fa[y][k])x=fa[x][k],y=fa[y][k];

里面的这个k我看题解里都是log2(dep[x])+1,但是我少了那个+1还是AC了,请问这个1有无影响,会不会被极限数据卡掉?

2021/3/25 22:06
加载中...