1 条题解

  • 0
    @ 2025-10-8 16:50:41

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    vector<pair<int,int>>G[N];
    int D,dep[N],st[N][20],dis[N];
    void dfs(int x,int xfa)
    {
        dep[x]=dep[xfa]+1;
        st[x][0]=xfa;for(int i=1;i<=D;i++)st[x][i]=st[st[x][i-1]][i-1];
        for(auto i:G[x])if(i.first!=xfa)
        {
            int y=i.first,w=i.second;
            dis[y]=dis[x]+w;
    		dfs(y,x);
        }
    }
    int LCA(int x,int y)
    {
        if(dep[x]<dep[y])swap(x,y); 
        for(int i=D;i>=0;i--)if(dep[st[x][i]]>=dep[y])x=st[x][i];
        if(x==y) return x;
    	for(int i=D;i>=0;i--)if(st[x][i]!=st[y][i])x=st[x][i],y=st[y][i];
        return st[x][0];
    }
    int main()
    {
        int n,m;scanf("%d%d",&n,&m);
        for(int i=1,x,y,w;i<n;i++)
        {
            scanf("%d%d%d",&x,&y,&w);
            G[x].push_back({y,w});
            G[y].push_back({x,w});
        }
        D=log2(n);memset(dep,0,sizeof(dep));memset(st,0,sizeof(st));memset(dis,0,sizeof(dis));
        dfs(1,0);
        for(int i=1,x,y;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",dis[x]+dis[y]-2*dis[LCA(x,y)]);
        }
        return 0;
    }
    
    • 1

    D155 【LCA最近公共祖先】树上任意两点的最短距离

    信息

    ID
    462
    时间
    200ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    321
    已通过
    66
    上传者