Codeforces 832D - Misha, Grisha and Underground

832D - Misha, Grisha and Underground

思路:lca,求两个最短路的公共长度。公共长度公式为(d(a,b)+d(b,c)-d(a,c))/2。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
const int INF=0x3f3f3f3f;
const int N=1e5+5;
const int logn=20;
vector<int>g[N];
int anc[logn][N];
int deep[N];
void dfs(int o,int u)
{
    deep[u]=deep[o]+1;
    for(int j=0;j<g[u].size();j++)
    {
        if(g[u][j]!=o)
        {
            anc[0][g[u][j]]=u;
            for(int i=1;i<logn;i++)anc[i][g[u][j]]=anc[i-1][anc[i-1][g[u][j]]];
            dfs(u,g[u][j]);
        }
    }
}
int lca(int u,int v)
{
    if(deep[u]<deep[v])swap(u,v);
    for(int i=logn-1;i>=0;i--)if(deep[anc[i][u]]>=deep[v])u=anc[i][u];
    if(u==v)return u;
    for(int i=logn-1;i>=0;i--)if(anc[i][u]!=anc[i][v])u=anc[i][u],v=anc[i][v];
    return anc[0][u];
}
int dis(int u,int v)
{
    int l=lca(u,v);
    return deep[u]+deep[v]-2*deep[l];
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,q;
    cin>>n>>q;
    for(int i=2;i<=n;i++)
    {
        int a;
        cin>>a;
        g[a].push_back(i);
        g[i].push_back(a);
    } 
    for(int i=0;i<logn;i++)anc[i][1]=1;
    dfs(0,1);
    while(q--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        int d1=(dis(a,b)+dis(b,c)-dis(a,c))/2+1;
        int d2=(dis(a,c)+dis(b,c)-dis(a,b))/2+1;
        int d3=(dis(a,b)+dis(a,c)-dis(b,c))/2+1;
        int ans=max(d1,max(d2,d3));
        cout<<ans<<endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/widsom/p/7258296.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值