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

Distance Queries(LCA)

    博客分类:
  • POJ
 
阅读更多
Distance Queries
Time Limit: 2000MS   Memory Limit: 30000K
Total Submissions: 8642   Accepted: 3036
Case Time Limit: 1000MS

Description

Farmer John's cows refused to run in his marathon since he chose a path much too long for their leisurely lifestyle. He therefore wants to find a path of a more reasonable length. The input to this problem consists of the same input as in "Navigation Nightmare",followed by a line containing a single integer K, followed by K "distance queries". Each distance query is a line of input containing two integers, giving the numbers of two farms between which FJ is interested in computing distance (measured in the length of the roads along the path between the two farms). Please answer FJ's distance queries as quickly as possible! 

Input

* Lines 1..1+M: Same format as "Navigation Nightmare" 

* Line 2+M: A single integer, K. 1 <= K <= 10,000 

* Lines 3+M..2+M+K: Each line corresponds to a distance query and contains the indices of two farms. 

Output

* Lines 1..K: For each distance query, output on a single line an integer giving the appropriate distance. 

Sample Input

7 6
1 6 13 E
6 3 9 E
3 5 7 S
4 1 3 N
2 4 20 W
4 7 2 S
3
1 6
1 4
2 6

Sample Output

13
3
36

Hint

Farms 2 and 6 are 20+3+13=36 apart. 

      题意:

      给出 N 和 M,代表有 N 个节点 M 条无向边。后给出这 M 条边的两端点编号和距离和方位(方位可以无视)。后有 K 个询问,每个询问输出一个答案,输出这两个点的距离。

 

      思路:

      LCA(最近公共祖先)(倍增法)。预处理每个结点的深度值 和 根节点到每个节点的距离值 dis,求出 两个点的 LCA 后 d = dis [ A ] + dis [ B ] - 2 X dis [ LCA ] 即可。

 

      AC:

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

using namespace std;

const int NMAX = 40005;
const int EMAX = NMAX * 5;

int ind, n, MAX_V;
int fir[NMAX], next[EMAX], v[EMAX], w[EMAX];
int par[20][NMAX], dep[NMAX], dis[NMAX];

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

void dfs(int i, int fa, int k, int d) {
        par[0][i] = fa;
        dep[i] = k;
        dis[i] = d;
        for (int e = fir[i]; e != -1; e = next[e]) {
                if (v[e] != fa) dfs(v[e], i, k + 1, d + w[e]);
        }
}

void init() {
        dfs(1, -1, 0, 0);

        for (int i = 0; i < MAX_V - 1; ++i) {
                for (int j = 1; j <= n; ++j) {
                        if (par[i][j] < 0) par[i + 1][j] = -1;
                        else par[i + 1][j] = par[i][ par[i][j] ];
                }
        }
}

int lca(int f, int t) {
        if (dep[t] > dep[f]) { int a = f; f = t; t = a; }

        int dis = dep[f] - dep[t];
        for (int i = 0; i < MAX_V; ++i)
                if ((dis >> i) & 1) f = par[i][f];

        if (f == t) return f;

        for (int i = MAX_V - 1; i >= 0; --i) {
                if (par[i][f] != par[i][t]) {
                        f = par[i][f];
                        t = par[i][t];
                }
        }

        return par[0][f];
}

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

        memset(fir, -1, sizeof(fir));
        ind = 0;
        MAX_V = 0;
        while ((1 << MAX_V) <= n) ++MAX_V;

        while (m--) {
                int a, b, num;
                char d;
                scanf("%d%d%d %c", &a, &b, &num, &d);
                add_edge(a, b, num);
                add_edge(b, a, num);
        }

        init();

        int k;
        scanf("%d", &k);
        while (k--) {
                int f, t;
                scanf("%d%d", &f, &t);
                int ans = lca(f, t);
                printf("%d\n", dis[f] + dis[t] - 2 * dis[ans]);
        }

        return 0;
}

 

 

 

分享到:
评论

相关推荐

    Pascal LCA 倍增法详解及代码

    最近公共祖先(LCA)问题在计算机科学,特别是在图论和数据结构中具有重要的应用,尤其是在树形数据结构的处理中。LCA指的是在一棵有根树中,给定两个节点u和v,找到离根最远的那个节点r,使得r既是u的祖先也是v的...

    LCA-AW2.2.zip

    【LCA词汇复杂度分析软件】是一款用于自然语言处理(NLP)的专业工具,它主要聚焦于语言的复杂度分析。LCA,全称为“Language Complexity Analysis”,此软件旨在帮助用户理解和评估文本的语言难度,这对于教育、...

    SAS+proc lca浅类别分析安装程序

    其中,PROC LCA(Latent Class Analysis)是SAS中的一个过程,用于执行潜在类别分析,这是一种统计方法,旨在从观测数据中识别出隐藏的、不可见的类别结构。PROC LCA尤其适用于处理多分类变量,它可以帮助研究人员...

    Tarjan 的 LCA 算法

    **Tarjan的LCA算法详解** 最近公共祖先(Lowest Common Ancestor,简称LCA)是图论中的一个重要概念,特别是在树形结构中。在树中,两个节点的最近公共祖先指的是距离根节点最近的那个同时是这两个节点的祖先的节点...

    LCA265显示器应用

    LCA265显示器是Systeme Lauer GmbH & Co. KG公司生产的一款专业显示器,用于显示和处理用户数据。在操作这款显示器时,有时需要进行数据传输,特别是文本文件的交换,这通常涉及到与个人计算机(PC)之间的通信。...

    LCA51正式版2.06

    《51单片机开发工具LCA51正式版2.06详解》 51单片机,作为微控制器领域中的经典型号,被广泛应用于各种电子设备和控制系统中。对于51单片机的开发者而言,拥有一款高效、易用的编辑器、编译器和仿真工具至关重要。...

    RMQ与LCA ACM必备

    例如,在一个树形结构中,A是B和C的LCA,D是E和F的LCA。 1. **Tarjan离线算法**: Tarjan提出了一种离线算法来解决LCA问题,使用并查集维护树结构,并通过深度优先搜索(DFS)进行预处理。每个节点u的father[u]...

    日立LCA电气图纸(K3500490).pdf

    这导致无法从中提取任何有关“日立LCA电气图纸(K3500490).pdf”文件的知识点。为了满足题目要求,我将基于标题和描述部分提供的信息,对“日立LCA电气图纸”进行知识性的解释。 ### LCA型微机控制变压变频调速无...

    LCA与RMQ问题详解

    ### LCA与RMQ问题详解 #### 一、问题描述 **LCA(Least Common Ancestors)** 和 **RMQ(Range Minimum Query)** 是数据结构和算法领域中两个非常重要的概念,它们各自解决了不同的问题,但在某些情况下可以互相转换...

    RMQ和LCA详解

    关于RMQ和LCA的关系的知识,如何用RMQ和LCA的转换

    lca51早期版本

    【LCA51早期版本】是一款专用于模拟和开发基于MCS-51(8051)微控制器的应用程序的软件工具。这个版本是2.02,可能对于一些研究历史版本、进行兼容性测试或者对旧项目进行维护的开发者来说具有一定的价值。在本文中...

    LCA.rar_LCA

    最近公共祖先(Lowest Common Ancestor,简称LCA)是图论中的一个重要概念,主要应用于树形结构的数据问题。在给定的树中,两个节点的最近公共祖先是指距离这两个节点最近的那个共同父节点。在计算机科学中,尤其是...

    lca.rar_LCA

    在IT领域,特别是数据结构和算法的设计中,"最近公共祖先"(Lowest Common Ancestor,简称LCA)是一个常见的问题。这个问题出现在许多场景中,比如计算机科学中的树形结构处理,生物信息学中的基因进化分析等。最近...

    中文LCA Training 2

    LCA 中文教程,内部资料--产品结构管理,还不错啊,可以看下

    LCA.zip_lca Tarjan pascal_lca pascal_tarjan lca pascal

    在IT领域,特别是数据结构和算法分析中,"LCA"是"Lowest Common Ancestor"(最近公共祖先)的缩写,这是一个经典的问题,常常出现在树形结构的处理中。给定一个树形结构和若干对节点,我们需要找出这些节点的最近...

    LCA生命周期评价PPT课件.ppt

    LCA生命周期评价,LCA生命周期评价课件,LCA生命周期评价PPT

    LCA.zip_C++_JDI_LCA_lca并查集_分治思想

    4. 优化查询效率:为了进一步提高查询速度,可以使用预处理的方法,如Tarjan's O(n)算法或LCA with LCA Queries in O(1)时间复杂度的算法。这些算法在构建树的同时计算出每个节点到根节点的路径信息,从而在O(1)时间...

    LCA没美国钢产品的生命周期评价.pptx

    生命周期评价(LCA)是一种系统性的评估方法,用于分析产品从原材料获取、生产制造、使用到最终废弃处理的整个生命周期中的环境影响。该方法源于国际标准化组织(ISO)制定的标准ISO 14040系列,它为进行生命周期...

    lca_Windows_6.9_DEV.30_predev_LCA.exe

    数据泄密(泄露)防护(Data leakage prevention, DLP),又称为“数据丢失防护”(Data Loss prevention, DLP),有时也称为“信息泄漏防护”(Information leakage prevention, ILP)。数据泄密防护(DLP)是通过一定的...

    slca算法的实现

    ### SLCA算法在XML数据库中的实现 #### 引言与背景 随着互联网技术的发展,XML(可扩展标记语言)作为一种重要的数据格式,在处理结构化数据方面扮演着关键角色。XML文档通常采用树形结构来组织数据,使得数据的...

Global site tag (gtag.js) - Google Analytics