当前位置: 首页 > article >正文

详解洛谷P2912 [USACO08OCT] Pasture Walking G(牧场行走)(lca模板题)

题目

 思路

一道模板题,没啥好说的,直接见代码

代码

#include <bits/stdc++.h>
using namespace std;
int n,q,a,to[100001][22],b,deep[100001],c,t[1000001];
struct ff
{
  int id,len;
};
vector<ff> vec[100001];
void dfs(int x,int fa,int dp,int now)//now是x的深度(不计边权,根的深度计为1) dp是x距离根节点的距离(计边权)
{
  deep[x] = now;//单独开now变量是因为边权并不影响lca的值
  t[x] = dp;
  to[x][0] = fa;
  for(int i = 0;i < vec[x].size();i++)
    if(vec[x][i].id != fa)
      dfs(vec[x][i].id,x,dp + vec[x][i].len,now + 1);
}
int lca(int x,int y)
{
  if(deep[x] < deep[y]) swap(x,y);
  for(int i = 21;i >= 0;i--)
    if(deep[to[x][i]] >= deep[y])
      x = to[x][i];
  if(x == y) return x;
  for(int i = 21;i >= 0;i--)
    if(to[x][i] != to[y][i])
    {
      x = to[x][i];
      y = to[y][i];
    }
  return to[x][0];
}
int main()
{
  cin>>n>>q;
  for(int i = 1;i < n;i++)
  {
    scanf("%d%d%d",&a,&b,&c);
    vec[a].push_back({b,c});
    vec[b].push_back({a,c});
  }
  dfs(1,0,0,1);
  for(int i = 1;i <= 21;i++)
    for(int j = 1;j <= n;j++)
      to[j][i] = to[to[j][i - 1]][i - 1]; 
  while(q--)
  {
    scanf("%d%d",&a,&b);
    int k = lca(a,b);
    printf("%d\n",t[a] + t[b] - 2 * t[k]);
    //a的深度-lca(a,b)的深度就是a到lca(a,b)的距离,b的深度-lca(a,b)的深度就是b到lca(a,b)的距离
    //加起来就是a到b的距离(因为a->b的路径必定会经过lca(a,b))
  }
  return 0;
}

结语

如果这篇文章对您要帮助的话,请点赞支持一下吖! <(^-^)>


http://www.kler.cn/a/233253.html

相关文章:

  • 如何在手机上完整下载B站视频并保存到相册?
  • 计算机网络 (1)互联网的组成
  • 前端vue 列表中回显并下拉选择修改标签
  • 准确率调整研究中心
  • 【数据结构与算法】第12课—数据结构之归并排序
  • Llama架构及代码详解
  • Nginx与history路由模式:刷新页面404问题
  • 动漫风博客介绍页面源码
  • 项目02《游戏-12-开发》Unity3D
  • 2.5 Binance_interface APP 现货交易-基础订单
  • C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析
  • 简化版SpringMVC
  • 在 Next 中, ORM 框架 Prisma 使用
  • Ajax+JSON学习二
  • C#,欧拉常数(Euler Constant)的算法与源代码
  • springboot/ssm学生请假管理系统 高校请假审批管理系统Java系统
  • jsp页面,让alert弹出信息换行显示
  • Rust方法自动解引用测试,总结和补充
  • 前端入门:(五)JavaScript 续
  • Oracle篇—logminer日志挖掘恢复误操作数据
  • Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)
  • 华为交换机常用命令
  • [office] excel2003进行可视性加密的方法 #媒体#其他#知识分享
  • 京东微前端框架MicroApp简介
  • 让cgteamwork自动为Houdini载入相机,角色道具的abc文件
  • docker下,容器无法启动,要删除里面的文件