*【bzoj 1602】牧场行走(LCA)

来源:互联网 发布:安信证券客户经理 知乎 编辑:程序博客网 时间:2024/06/04 20:11

传送门biu~
lca模板题,不多说直接上代码。

#include<bits/stdc++.h>#define N 1005using namespace std;int n,q;int head[N],nex[2*N],to[2*N],len[2*N],tp;int storey[N],dep[N];int f[N][11];inline void add(int x,int y,int l){    nex[++tp]=head[x];    head[x]=tp;    to[tp]=y;    len[tp]=l;}void dfs(int x,int father){    f[x][0]=father;    storey[x]=storey[father]+1;    for(int i=head[x];i;i=nex[i]){        if(to[i]==father)   continue;        dep[to[i]]=dep[x]+len[i];        dfs(to[i],x);    }}int lca(int x,int y){    if(storey[x]<storey[y])     swap(x,y);    for(int i=10;i>=0;--i)        if(storey[f[x][i]]>=storey[y])      x=f[x][i];    if(x==y)        return x;    for(int i=10;i>=0;--i){        if(f[x][i]!=f[y][i]){            x=f[x][i];            y=f[y][i];        }    }    return f[x][0];}int main(){    scanf("%d%d",&n,&q);    for(int i=1;i<=n-1;++i){        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        add(a,b,c);        add(b,a,c);    }    dfs(1,0);    for(int i=1;i<=10;++i)        for(int j=1;j<=n;++j)            f[j][i]=f[f[j][i-1]][i-1];    for(int i=1;i<=q;++i){        int a,b;        scanf("%d%d",&a,&b);        printf("%d\n",dep[a]+dep[b]-2*dep[lca(a,b)]);    }    return 0;}