HDU-2586 LCA入门模板

STM32H7+LAN8720A之ETH与LWIP配置问题(End) 开篇介绍 由于项目中需要使用到STM32H7系列的芯片,且该系列无法移植ST的标准库,只能使用ST的HAL库,通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口,在简化的四层模型中充当着数据链路层的角色,我们只需添加PHY并配置好IP,即可实现基本的TCP主从机通信、UDP通信等等。 一、激光雷达3i-T1 由于使用了一款只具有网口通信的单线激光雷达,其具有TCP和UDP方式的通信方式,为了避免进行TCP中的socket报文解析和繁琐的通信握手过程,我们首先将雷达配 阅读详情

HDU-2586 How far away ?


Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23475 Accepted Submission(s): 9317


Problem Description

There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this “How far is it if I want to go from house A to house B”? Usually it hard to answer. But luckily int this village the answer is always unique, since the roads are built in the way that there is a unique simple path(“simple” means you can’t visit a place twice) between every two houses. Yout task is to answer all these curious people.

Input

First line is a single integer T(T<=10), indicating the number of test cases.
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0

Output

For each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.

Sample Input

2
3 2
1 2 10
3 1 15
1 2
2 3

2 2
1 2 100
1 2
2 1

Sample Output

10
25
100
100

LCA,通过公共祖先来简化求树中任意两点距离的算法。
学长提供的模板及解释:

void dfs(int u,int fa,int d,int dd){

     dep[u] =  d;//求深度
     dis[u] = dd;//求距离
     if(u==1){
        for(int i = 0;i<20;i++)par[u][i] = 1;/*以u为1祖先 那么不管1怎么跳都只能跳到自己*/
     }
     else{
        par[u][0] = fa;/*跳2^0  = 1 步就是跳到他爸爸*/
        for(int i = 1;i<20;i++){
            par[u][i] = par[par[u][i-1]][i-1];
            /*
                怎么理解呢?
                我们先分析一下 2 = 1+ 1,4 = 2+2, 8 = 4+4;
                其实就是2^n = 2^(n-1) + 2^(n-1);
                那么u跳2^n步所到的点就等于 u 跳到2^(n-1)步跳到的祖先(假设为v)再跳2^(n-1)步所到的点

            */
        }
     }
     for(auto e:G[u]){
         int v = e.fi,c = e.se;
         if(v==fa)continue;
         dfs(v,u,d+1,dd+c);
     }
}
int Jump(int u,int d){
    for(int j = 19;j>=0;j--){
        if((1<<j)&d){
            u = par[u][j];
            /*
              10010
              10000
              00010
            */
        }
    }
    return u;
}
int lca(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    u = Jump(u,dep[u]-dep[v]);
    /*
       先找到深度更大的点往上跳,让它与另外一个
       深度更小的点同深度。
    */
    if(u==v)return u;
    /*
       特判一下
       如果两点相同表明在同一颗子树直接返回就好了。
    */
    for(int i = 19;i>=0;i--){
        if(par[u][i]!=par[v][i]){
            /*跳2^i 步仍没有找到公共祖先,表明u和v都需要往上跳2^i步*/
            u = par[u][i];
            v = par[v][i];
        }
    }
    return par[u][0];
}

自己写的应用代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int MAXL=40004;
int n,m,t;
int dep[MAXL],dis[MAXL];
int par[MAXL][18];
vector<pair<int ,int> > tree[MAXL];
void pre_dfs(int k,int fa,int d,int dd)
{
    dep[k]=d;
    dis[k]=dd;
    int len=tree[k].size();
    if(k==1)
        for(int i=0;i<18;i++) par[k][i]=1;
    else
    {
        par[k][0]=fa;
        for(int i=1;i<18;i++)
            par[k][i]=par[par[k][i-1]][i-1];//biru 2^k=2^(k-1)*2 jwzi
    }
    for(int i=0;i<len;i++)
    {
        int j=tree[k][i].first,val=tree[k][i].second;
        pre_dfs(j,k,d+1,dd+val);
    }
}
int skip(int a,int level)
{
    for(int i=17;i>=0;i--)
    {
        if(1<<i&level)
            a=par[a][i];
    }
    return a;
}
int lca(int a,int b)
{
    if(dep[a]<dep[b]) swap(a,b);
    a=skip(a,dep[a]-dep[b]);
    if(a==b) return a;
    for(int i=17;i>=0;i--)
    {
        if(par[a][i]!=par[b][i])
        {
            a=par[a][i];
            b=par[b][i];
        }
    }
    return par[a][0];
}
int main(void)
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        int x,y,val;
        for(int i=0;i<n-1;i++)
        {
            scanf("%d%d%d",&x,&y,&val);
            if(x>y) swap(x,y);
            tree[x].push_back(make_pair(y,val));
        }
        pre_dfs(1,0,1,0);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
        int fa,res;
        fa=lca(x,y);
        res=dis[x]+dis[y]-dis[fa]*2;
        printf("%d\n",res);
        }
    }
    return 0;
}
lisflood-fp(一)从源码到可执行文件:Windows下的Cmake实战编译指南 本文详细介绍了在Windows环境下使用Cmake工具编译lisflood-fp水文模型源码生成可执行文件的全过程。从开发环境配置、源码获取到实战编译,逐步指导如何解决常见错误并处理运行时依赖,最终生成可用的exe文件。特别适合水文专业研究者和工程师学习参考。 阅读详情

相关推荐

HarmonyOS开发第一步:Dev Eco Studio4.0保姆级安装配置指南(含Node.js环境)

本文提供HarmonyOS开发环境搭建的保姆级教程,重点详解Dev Eco Studio 4.0的安装与配置,并攻克Node.js环境与Ohpm包管理器的关键设置难点。通过清晰的步骤指引,帮助开发者从零开始,高效完成开发环境部署,顺利迈出鸿蒙应用开发的第一步。

lake5的博客 569

hdu2586 LCA模板

hdu2586 先预处理 然后是   在线询问 (也就是一边读入一边查询) #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include using namespace std; #define maxn 400010 int n; struct Nod

Time flies 4711

基于FPGA的DDS信号发生器

之前的博客讲到了DDS的基本原理,现在用Verilog代码实现DDS,能够产生四种波形,方波,三角波,正弦波,锯齿波,用按键来控制频率和选择波形。其中按键消抖模块来自小梅哥的FPGA自学笔记设计与验证这本书。 module DDS_Module( Clk, Rst_n, EN, Fword, Key1, Pword, DA_Clk, DA_Data ); input Clk...

qq_43534451的博客 9949

HDU-2586,LCA模板题

HDU-2586 How far away ? 题目大意:给你n个节点组成的树,树的每条边上都有一定的权值,问你树上两点之间的 距离是多少 具体思路:此题是在学习tarjan中找到的一道题,由于题目给出的是一个树,可以联想到 子节点与根节点之间的关系,我们可以通过dfs求出子节点与根节点之间的距离,对于树中 任意的...

weixin_30345055的博客 96

避坑指南:Livox Mid-360双雷达SLAM配置中,那些官方文档没说的细节(IP设置、话题分离与时间同步)

本文详细解析了Livox Mid-360双雷达SLAM配置中的关键优化点,包括IP设置、话题分离与时间同步等官方文档未提及的细节。通过实战案例和代码示例,帮助开发者解决点云错位、IMU数据混乱等问题,提升SLAM系统的稳定性和精度。特别针对网络架构设计、驱动修改和时间同步机制提供了专业指导。

weixin_29745609的博客 425

vuecil3+版本下,兼容ie等不支持es6的低版本浏览器

*综上,完成兼容性涉及到的配置的文件有,对应在页面中查看代码,就不单独附代码了:main.js。

yhr0322的博客 833

HDU2586(LCA模板)

本题大意是在一个图中,求两个点之间的最短路径。这个图有n个点,n-1条边,也可以看成是一棵树。在树上求两点的最小距离,可以看作是LCA问题的延伸。LCA算法详解:倍增法、DFS+ST 本题中给的是图,我们要将这个图转化成树,首先要规定根节点就是编号为1的结点。然后在此基础上求每个结点的深度和其父节点。而两个点之间的最小距离就是:两个点分别到根节点的距离相加,再减去...

Q_M_X_D_D_的博客 507

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照下面进行详细步骤说明,感兴趣的同学可以看一下: 1简单示例(一条线): 2.数据源随着时间不断变化,进度条变化 。多条线: 3.看在整段时期内的数据大体图(消去或出现)进度条: 4.后台将时刻记录变化记录到一个txt文本里以供详细校验: 话不多说上码: using System; using Sys...

帅boy的博客 4308

LCA 最近公共祖先(模板) HDU2586 离线与在线算法

http://acm.hdu.edu.cn/showproblem.php?pid=2586 忽然发现访客量有点多。在贴一个树剖LCA的板子吧。 最近做树形DP和树形结构时,发现LCA这个东西有点家常,而以前也只会离线算法,现在补一下这个知识点,在这里丢两个模板。 在线倍增算法,感觉也不是很难,当你真正的了解了倍增的意思,这个算法真的就不难了。 首先 p[i][j]表示i结点的第2^j个父...

KXL5180的博客 2291

【制作100个unity游戏之22】3DRPG游戏开发01——项目的设置和导入及渲染管线的安装修复

如果你现在存在一些疑惑unity导入素材为什么是粉紫色的?表示他没有适配我们的URP通用渲染管线,要如何适配呢?素材渲染错误丢失要如何解决?如果你有上面3个任意的问题,那这篇文章同样适合你,我将手把手教你如何安装修复渲染管线,看完你就了解了!在Unity中,他们都是渲染管线,它们的主要区别在于性能和功能。LWRP是早期版本的URP,它专门为移动设备和低端PC设计,旨在提供更高的性能。它使用基于顶点的光照和简化的后处理效果,可以在更低的硬件要求下运行。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2428

17、神经网络训练算法与高阶模糊Cohen - Grossberg神经网络稳定性分析

本文介绍了一种新的数据驱动算法用于神经网络训练,该算法继承三次样条权重函数的优点,具有简单架构和良好泛化性能,并通过并行机制显著提升训练速度。同时,研究了高阶模糊Cohen-Grossberg神经网络(HOFCGNN)在可变及无界延迟下的稳定性,利用M矩阵理论和向量Lyapunov函数方法,证明了系统平衡点的存在性、唯一性和全局指数稳定性。研究成果为神经网络的高效训练与稳定应用提供了理论支持和技术路径。

b9c0d的博客 147

hdu 2586 lca模板题

How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4106    Accepted Submission(s): 1567 Problem Description There are n hou

_rabbit的专栏 1906

基于Simulink的自适应反步法(Adaptive Backstepping)控制​

本文针对非线性系统控制中未知参数和强非线性耦合的挑战,提出基于Simulink的自适应反步法解决方案。通过融合参数在线估计与反步递归设计,该方法显著提升了永磁同步电机(PMSM)速度控制的鲁棒性,使跟踪误差从20%降至3%,参数估计收敛时间小于0.5秒。文章详细阐述了从算法推导到Simulink实现的完整流程,包括系统架构设计、核心算法推导(以PMSM为例)、模块化建模方法、参数优化策略以及工程部署建议。提供的自适应控制器MATLAB代码和关键参数表可直接应用于实际工程,为电机驱动、机械臂等非线性系统控制提

xiaoheshang_123的博客 101

【HDU 2586】LCA模板

在一棵树上 求2个点的最短距离,那么首先利用LCA找到2个点的最近公共祖先 公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y)) 这里的dis(x)指的上x距离根节点的距离 注意一些细节方面,比如数组的越界问题: #include #include #include #include using namespace std; typedef long l

花月阁 750

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

HDU2586 How far away ?【LCA+并查集】

How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 33479 Accepted Submission(s): 13542 Problem Description There are n houses in...

海岛Blog 636

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

hdu 2586 LCA模板题(离线和在线两种解法)

http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this

ACM,再见! 4639

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HDU-2586(LCA)

How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32298 Accepted Submission(s): 13051 Problem Description There are n hou...

qq_44641782的博客 435

HDU 2586 LCA模板

好题题解题意倍增法 题意 这个是一个LCA裸题,题意不难理解 倍增法 下面来一个讲解LCA非常棒的博客: Author by Morslin 然后根据我自己的风格,写出本题的代码 #include <bits/stdc++.h> using namespace std; const int MAXV = 4e5 + 5; struct Edge { int to; int nxt; }g[MAXV << 1]; int head[MAXV], tol;

Bran 164

【HDU 2586 How far away ?】 LCA模板题

hdu 2586 给你一颗树 树上两点之间有有权边 给你m个询问 问你 a b 两个点之间距离是多少 我们用dis数组统计从起点到每个点的距离长度 那么容易知道 dis(a,b) = dis[a] - dis[b] - 2*dis[LCA(a,b)] O(nlogn + mlogn) /* if you can't see the repay Why not just work s...

我是谁 --- 卡比兽 165

HDU 2586 How far away ? (LCA最近公共祖先)

题目地址:HDU 2586 LCA第一发。 纯模板题。 偷懒用的vector,结果一直爆栈。把G++改成C++就过了。。 代码如下:#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map>

scf0920 899

HDU2586——How far away ?(LCA模板)

How far away ? 题意:给出一棵树,问两个节点x,y之间的最短距离是多少(边权值)。 思路:用根节点到x的距离+根节点到y的距离−多走的距离根节点到x的距离+根节点到y的距离-多走的距离根节点到x的距离+根节点到y的距离−多走的距离 其中多走的距离要用LCA解决。 LCALCALCALCALCALCALCA求解方法1.欧拉序+++线段树或RMQ欧拉序RMQ(线段树)2.Tarjan LCALCALCA LCALCALCA只是一个概念,它的是一棵树上的两个节点的最近公共祖先。当然,它也是一个节点。

weixin_45363113的博客 607

HDU 2586 倍增 / Tarjan LCA

题意 传送门 HDU 2586 题解 LCALCALCA 模板题。 倍增 LCA 基于倍增的 LCALCALCA 时间复杂度 O((n+m)log⁡n)O\big((n+m)\log n\big)O((n+m)logn)。 #include <algorithm> #include <cstdio> #include <cstring> using namespace std; #define maxn 40005 #define maxlg 16 int T, N, Q

neweryyy的博客 223

hdu2586(带权LCA)

题意: 给定n−1n-1n−1个边的边权,mmm次询问,每次询问任意两点的最短路。 题解: 带权LCA模板。预处理时一并处理两点间最短路即可。 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 1e5 + 10; con...

solego’s blog 352

【离线Tarjan 模板】LCA tarjan 算法 练习: hdu 2586 + poj 1986

个人一直觉得kuangbin大牛的LCA板子 感觉有点不太好用,于是在这个大牛的博客帮助下,更换了自己的板子; http://www.cnblogs.com/scau20110726/archive/2013/05/26/3100265.htmlhdu 2586, 给一颗树 ,每一条边有权值,然后m次询问,每一次询问两个点:i,j。 输出 i,j的最短距离。#include <iostream>

qq_24664053的博客 565

HDU 2586 倍增求LCA模板

There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it hard to...

hutwuguangrong的博客 275

hdu 2586 How far away LCA在线RMQ(模板题)

点击打开链接 求dist(u,v) 用最短路flold显然超时 由于是树,则可以O(n)求出w=LCA(u,v) dist(u,v)=d(u)+d(v)-2*d(w); d(i)为根到结点i的距离  计算w=LCA(u,v) w为u->v路径中深度最小的点 则先用dfs记录u->v路径的遍历顺序,然后RMQ求出该路径中(pos[u]~pos[v])中dep最小的编号x 返回vs[x]即可

Masamiiiiii 467
上一篇: CSU-2151 集训难度
timelooper
博客等级 码龄9年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值