LCA最近公共祖先模板

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define N 100010
int n,m,t;
int head[N],nex[N<<1],w[N<<1],e[N<<1],tot;
int d[N],deep[N],f[N][20];

void add(int x,int y,int z){
    e[++tot]=y,w[++tot]=z,nex[tot]=head[x],head[x]=tot;
}

void bfs(){
    d[1]=0;
    deep[1]=1;
    queue<int>que;
    que.push(1);
    while(que.size()){
        int t=que.front();
        que.pop();
        for(int i=head[t];i;i=nex[i]){
            int y=e[i];
            if(deep[y]) continue;
            deep[y]=deep[t]+1;
            d[y]=d[t]+w[i];
            f[y][0]=t;
            for(int j=1;j<=t;j++)
                f[y][j]=f[f[y][j-1]][j-1];
            que.push(y);
        }
    }
}

int lca(int x,int y){
    if(d[x]>d[y]) swap(x,y);
    for(int i=t;i>=0;i--)
        if(deep[f[y][t]]>=deep[x]) y=f[y][t];
    if(x==y) return x;
    for(int i=t;i>=0;i--)
        if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
    return f[x][0];
}


int main()
{
    cin>>n;
    t= (int)(log(t)/log(2))+1;
    for(int i=1;i<n;i++){
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    bfs();
    return 0;
}
发布了38 篇原创文章 · 获赞 5 · 访问量 838

猜你喜欢

转载自blog.csdn.net/Fooooooo/article/details/104822651
今日推荐