`
Simone_chou
  • 浏览: 198761 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

How far away ?(LCA 在线算法RMQ)

    博客分类:
  • HDOJ
 
阅读更多

How far away ?

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


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<k<=40000).The houses are labeled from 1 to n.
  Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
 

 

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

     

      题意:

      给出 T(0 ~ 10) 组 case,每个 case 给出 N(2 ~ 40000) 个节点和 M (1 ~ 200)个询问,后给出 N - 1 条边的两节点和权值。每次询问输出一个答案,输出 a 到 b 的距离。

 

      思路:

      LCA。RMQ 的在线算法,任何一个根为起点都可以,dfs 的时候顺便用 dis 记录到根的距离,求出 a 和 b 的 LCA c,则距离等于 dis [ a ] + dis [ b ] - 2 X dis [ c ]。因为 RMQ 数组的长度开小了,所以 WA 了很多遍。

 

       AC:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int VMAX = 40010;
const int EMAX = VMAX * 10;

int n, ind;
int next[EMAX], fir[VMAX], w[EMAX], v[EMAX];

int k;
int dis[VMAX], vs[VMAX * 5], dep[VMAX * 5], id[VMAX];
bool vis[VMAX];

int dp[VMAX * 5][25];

void init () {
    ind = k = 0;
    memset(fir, -1, sizeof(fir));
    memset(vis, 0, sizeof(vis));
}

void add_edge (int f, int t, int val) {
    v[ind] = t;
    w[ind] = val;
    next[ind] = fir[f];
    fir[f] = ind;
    ++ind;
}

void dfs (int x, int d) {
    id[x] = k;
    vs[k] = x;
    dep[k++] = d;
    vis[x] = 1;

    for (int e = fir[x]; e != -1; e = next[e]) {
        int V = v[e];
        if (!vis[V]) {
            dis[V] = dis[x] + w[e];
            dfs(V, d + 1);
            vs[k] = x;
            dep[k++] = d;
        }
    }
}

void RMQ_init () {
    for (int i = 0; i < k; ++i) dp[i][0] = i;

    for (int j = 1; (1 << j) <= k; ++j) {
        for (int i = 0; i + (1 << j) - 1 < k; ++i) {
            int a = dp[i][j - 1];
            int b = dp[i + (1 << (j - 1))][j - 1];
            if (dep[a] > dep[b]) dp[i][j] = b;
            else dp[i][j] = a;
        }
    }
}

int RMQ (int L, int R) {
    int len = 0;
    while ((1 << (len + 1)) <= (R - L + 1)) ++len;

    int a = dp[L][len];
    int b = dp[R - (1 << len) + 1][len];

    if (dep[a] > dep[b]) return b;
    return a;
}

int LCA (int a, int b) {
    int L = min(id[a], id[b]);
    int R = max(id[a], id[b]);
    int Min = RMQ(L, R);
    return vs[Min];
}

int main () {

    int T;
    scanf("%d", &T);

    while (T--) {
        init();

        int m;
        scanf("%d%d", &n, &m);

        for (int i = 1; i <= n - 1; ++i) {
            int a, b, val;
            scanf("%d%d%d", &a, &b, &val);
            add_edge(a, b, val);
            add_edge(b, a, val);
        }

        dfs (1, 1);

        RMQ_init();

        while (m--) {
            int a, b;
            scanf("%d%d", &a, &b);

            int node = LCA(a, b);
            printf("%d\n", dis[a] + dis[b] - 2 * dis[node]);
        }

    }

    return 0;
}

 

  

分享到:
评论

相关推荐

    ACM之图论500道

    对于更复杂的问题,如"2121 Ice_cream’s world II"中的最小树形图、"3311 Dig The Wells"的斯坦纳树以及"2586 How far away ?"的最近公共祖先(LCA)问题,这些都要求你对图论有高级的理解和熟练的实现能力。 ...

    残疾人轮椅设计.rar

    残疾人轮椅设计.rar

    SYMB_FAST.shx

    拷贝到Auto CAD的Fonts下

    自我提升-教材-浮游生物学

    内容:浮游生物学Plankton(英文版本) 密码:123***(你猜)

    chrome 浏览器插件 myTools, 日常小工具

    chrome 浏览器插件 myTools, 日常小工具。

    实训商业源码-新版影视-论文模板.zip

    实训商业源码-新版影视-论文模板.zip

    实训商业源码-微信交友unicloud云开发小程序-论文模板.zip

    实训商业源码-微信交友unicloud云开发小程序-论文模板.zip

    端盖零件的工艺规程及钻Φ16H7孔的工装夹具设计(1).rar

    端盖零件的工艺规程及钻Φ16H7孔的工装夹具设计(1).rar

    变转速滚动轴承故障诊断中角域重采样与随机共振技术的应用研究 角域重采样

    内容概要:本文探讨了一种创新性的变转速滚动轴承故障特征提取方法,即角域重采样与随机共振技术相结合的方法。首先介绍了变转速工况下传统频谱分析失效的原因,然后详细阐述了角域重采样的具体步骤,即将时变振动信号转换为角域循环平稳信号。接着,利用自适应随机共振方法进一步增强重采样信号,使得故障特征更加显著。此外,提出了角域采样频率的计算公式,解决了阶次变换时采样频率不确定的问题,从而获得了更为明显的阶次谱。实验结果显示,该方法能够有效提高故障识别的准确性。 适合人群:机械工程领域的研究人员和技术人员,尤其是从事设备状态监测与故障诊断工作的专业人员。 使用场景及目标:适用于变转速工况下的滚动轴承故障检测,旨在提高故障特征提取的准确性和可靠性,特别是在风电齿轮箱等复杂应用场景中。 阅读建议:读者可以通过本文深入了解角域重采样和随机共振的基本原理及其在实际应用中的实施细节,同时关注文中提供的具体代码示例,以便更好地理解和掌握这一先进技术。

    ### 内存管理与优化综述

    内容概要:本文详细介绍了Android平台下的内存管理机制及其相关优化措施,涵盖了从内存泄漏的成因、检测手段到具体的优化建议。文章首先阐述了内存泄漏的常见原因,如匿名内部类、线程、Handler、单例模式、资源未关闭、集合类、静态变量等,接着介绍了检测内存泄漏的工具和方法,包括LeakCanary、MAT(Memory Analyzer Tool)、Memory Profiler、dumpsys meminfo等。此外,文章还探讨了内存抖动、内存溢出等问题,并提供了详细的优化建议,如慎用桥接模式、避免使用枚举、使用优化后的数据容器、谨慎使用large heap、优化图片处理等。最后,文章提到一些特定场景下的内存优化策略,如onLowMemory()与onTrimMemory()回调的使用、资源文件的合理存放、使用ProGuard剔除不必要的代码等。 适合人群:具有一定Android开发经验的程序员,尤其是对内存管理和优化感兴趣的开发者。 使用场景及目标:①帮助开发者理解Android内存管理的基本原理;②提供有效的工具和方法来检测和解决内存泄漏问题;③指导开发者优化应用内存使用,提高应用性能和稳定性;④适用于开发阶段的内存问题排查和发布前的性能优化。 其他说明:文章内容详尽,适合深入学习和实践,尤其对于优化大型复杂应用的内存表现具有重要参考价值。文中提及的工具和技术需要开发者结合实际项目情况进行应用和调整。

    Abaqus Vumat子程序在三维纤维复合材料弹性层压板及Hashin-Puck损伤模拟中的应用 Hashin损伤

    内容概要:本文详细介绍了利用Abaqus中的Vumat子程序对三维纤维复合材料进行建模的方法。重点讨论了弹性层压板的模拟,以及Hashin损伤模型(针对纤维)和Puck损伤模型(针对基质)的具体应用。文中解释了如何通过编写Vumat代码来定义材料的弹性行为、损伤起始和演化等特性,从而更精确地模拟复合材料在受力条件下的响应。 适合人群:从事复合材料研究和工程模拟的技术人员,尤其是那些熟悉Abaqus软件并希望深入了解Vumat子程序的人群。 使用场景及目标:适用于航空航天、汽车制造等领域中涉及复合材料的设计和分析项目。目标是提高对复合材料性能的理解,优化设计流程,确保产品安全性和可靠性。 其他说明:文章强调了复合材料模拟的复杂性和趣味性,鼓励读者不断学习新方法和技术,以应对日益增长的工程需求。

    C语言程序设计,完整代码

    C语言程序设计,完整代码

    elk镜像3(kibana)

    elk镜像3(kibana)

    实训商业源码-物业管理-论文模板.zip

    实训商业源码-物业管理-论文模板.zip

    手势估计-在Jetson-Nano上部署实时手势估计+手势分类算法-附项目源码-优质项目实战.zip

    手势估计_在Jetson_Nano上部署实时手势估计+手势分类算法_附项目源码_优质项目实战

    实训商业源码-微信挪车1.5.5旗舰版全开源-论文模板.zip

    实训商业源码-微信挪车1.5.5旗舰版全开源-论文模板.zip

    ### Android输入系统架构与事件处理流程解析:从硬件中断到应用层响应

    内容概要:本文详细描述了Android系统中输入事件的处理流程,特别是InputManagerService (IMS) 和 PhoneWindowManager (PWM) 的工作原理。文章从Linux内核开始,阐述了输入设备的中断处理,原始事件通过设备节点传递到用户空间,再到IMS的Java层和Native层的处理过程。IMS中的关键组件包括EventHub、InputReader和InputDispatcher,分别负责事件的收集、加工和分发。事件最终被传递到WMS管理的窗口中,由ViewRootImpl沿着控件树分发给感兴趣的控件。此外,文章还介绍了Power按键的处理流程,包括按键事件的上报、处理和屏幕唤醒机制。最后,简要介绍了getevent和sendevent工具,用于监听和模拟输入事件。 适合人群:具有Android开发经验的研发人员,尤其是对输入事件处理机制感兴趣的开发人员。 使用场景及目标:①理解输入事件从硬件到应用层的完整处理流程;②掌握InputManagerService和PhoneWindowManager的核心组件及其工作原理;③学习如何利用getevent和sendevent工具进行自动化测试和调试。 其他说明:本文不仅详细描述了输入事件的处理过程,还提供了丰富的代码片段和函数调用链,帮助读者深入理解每个步骤的具体实现。此外,通过实际案例(如Power按键处理)展示了输入事件处理的实际应用场景,增强了理论与实践的结合。

    实现Vue.js导出Excel表格+源码+项目文档(实用小工具&&课程设计)

    实现Vue.js导出Excel表格+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 实现Vue.js导出Excel表格+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 实现Vue.js导出Excel表格+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 实现Vue.js导出Excel表格+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 实现Vue.js导出Excel表格+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 实现Vue.js导出Excel表格+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~

    ECEF2LLA坐标转换

    5.保证无毒 1.简单,方便,实用 3.实例可以自行改用 1.如有非法,本人无法律责任! 8.更多作品,查找标签“朱建强”7.下载,请杀毒! 4.如需联系我请看左边数字!1.如不知代表何物,那就放弃计算机吧! 0.还不懂?CSDN老板不让我上传联系方式。

    JOINT.SHX

    拷贝到Auto CAD的Fonts下

Global site tag (gtag.js) - Google Analytics