loj #10134. 「一本通 4.4 练习 1」Dis

Posted pjxpjx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了loj #10134. 「一本通 4.4 练习 1」Dis相关的知识,希望对你有一定的参考价值。

题目链接

题意:

给定每个边的权值,每次求u,v两点的距离。

题解:

把每个边上的权值给挂到每条边的儿子节点下面,跑一边树上前缀和自顶向下模板,没了。

裸的树上前缀和模板
但要注意:DFS中邻接表中前缀和的变量不能打错了

Code:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int N=200005;
const int M=25;
int Q,n,m,head[N],dou[N][M],cnt,dep[N],b[N],k,total[N],wei[N];
struct node{
    int u,v,next,sum;
}ed[N]; 
void add_edge(int u,int v,int k)
{
    cnt++;
    ed[cnt].u=u;
    ed[cnt].v=v;
    ed[cnt].next=head[u];
    ed[cnt].sum=k;
    head[u]=cnt;
}
void dfs(int xx)
{
    for(int i=1;i<=20;i++)
    {
        dou[xx][i]=dou[dou[xx][i-1]][i-1];
    }
    for(int i=head[xx];i!=0;i=ed[i].next)
    {
        int temp=ed[i].v;
        if(b[temp]==0)
        {
            b[temp]=1;
            dep[temp]=dep[xx]+1;
            total[temp]=ed[i].sum+total[xx];
            dou[temp][0]=xx;
            dfs(temp);
        }
    }
}
int LCA(int x,int y)
{
    if(dep[x]<dep[y])
    swap(x,y);
    int temp=dep[x]-dep[y];
    for(int i=20;i>=0;i--)
    {
        if(1<<i&temp)
        {
            x=dou[x][i];
        }
    }
    if(x==y)
    return x;
    for(int i=20;i>=0;i--)
    {
        if(dou[x][i]!=dou[y][i])
        {
            x=dou[x][i];
            y=dou[y][i];
        }
    } 
    return dou[x][0];
}
int main()
{
    cin>>n;
    cin>>m;
    for(int i=1;i<n;i++)
    {
        int x,y,k;
        scanf("%d%d%d",&x,&y,&k);
        add_edge(x,y,k);
        add_edge(y,x,k);
    }
    b[1]=1;
    dep[1]=1;
    dfs(1);
    while(m--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int lca=LCA(x,y);
        cout<<total[x]+total[y]-total[lca]-total[lca]<<endl;
    }
    return 0;
}

以上是关于loj #10134. 「一本通 4.4 练习 1」Dis的主要内容,如果未能解决你的问题,请参考以下文章

loj10195. 「一本通 6.1 练习 2」转圈游戏 (loj2608)

loj10188. 「一本通 5.6 练习 1」玩具装箱

loj10150. 「一本通 5.1 练习 1」括号配对

loj10144. 「一本通 4.6 练习 1」宠物收养所

loj10139. 「一本通 4.5 练习 1」树上操作(loj2125. 「HAOI2015」树上操作 )

loj10194. 「一本通 6.1 练习 1」A 的 B 次方