标题来源:POJ 1986 Distance Queries

意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离

思路:对于2点 u v dis(u,v) = dis(root,u) + dis(root,v) - 2*dis(roor,LCA(u,v)) 求近期公共祖先和dis数组

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 40010;
int first[maxn], head[maxn], cnt, sum;
struct edge
{
int u, v, w, next;
}e[maxn*2], qe[maxn], Q[maxn];
int ans[maxn];
int f[maxn], vis[maxn];
int d[maxn];
void AddEdge(int u, int v, int w)
{
e[cnt].u = u;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = first[u];
first[u] = cnt++;
e[cnt].u = v;
e[cnt].v = u;
e[cnt].w = w;
e[cnt].next = first[v];
first[v] = cnt++;
} void AddEdge2(int u, int v, int w)
{
qe[sum].u = u;
qe[sum].v = v;
qe[sum].w = w;
qe[sum].next = head[u];
head[u] = sum++;
qe[sum].u = v;
qe[sum].v = u;
qe[sum].w = w;
qe[sum].next = head[v];
head[v] = sum++;
} int find(int x)
{
if(f[x] != x)
return f[x] = find(f[x]);
return f[x];
}
void LCA(int u, int k)
{
f[u] = u;
d[u] = k;
vis[u] = true;
for(int i = first[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(vis[v])
continue;
LCA(v, k + e[i].w);
f[v] = u;
}
for(int i = head[u]; i != -1; i = qe[i].next)
{
int v = qe[i].v;
if(vis[v])
{
ans[qe[i].w] = find(v);
}
}
}
int main()
{
int n, m;
memset(first, -1, sizeof(first));
memset(head, -1, sizeof(head));
cnt = 0;
sum = 0;
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
{
int u, v, w;
char s[10];
scanf("%d %d %d %s", &u, &v, &w, s);
AddEdge(u, v, w);
}
int q;
scanf("%d", &q);
for(int i = 0; i < q; i++)
{
int u, v;
scanf("%d %d", &u, &v);
Q[i].u = u, Q[i].v = v;
AddEdge2(u, v, i);
AddEdge2(v, u, i); }
memset(vis, 0, sizeof(vis));
d[1] = 0;
LCA(1, 0);
for(int i = 0; i < q; i++)
{
int u = Q[i].u, v = Q[i].v;
printf("%d\n", d[u] + d[v] - 2*d[ans[i]]);
}
return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

POJ 1986 Distance Queries LCA两点距离树的更多相关文章

  1. POJ.1986 Distance Queries ( LCA 倍增 )

    POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...

  2. POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]

    题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...

  3. poj 1986 Distance Queries LCA

    题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...

  4. POJ 1986 Distance Queries(LCA Tarjan法)

    Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...

  5. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  6. POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】

    任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total ...

  7. POJ 1986 Distance Queries(Tarjan离线法求LCA)

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12846   Accepted: 4552 ...

  8. poj 1986 Distance Queries(LCA)

    Description Farmer John's cows refused to run in his marathon since he chose a path much too long fo ...

  9. poj 1986 Distance Queries(LCA:倍增/离线)

    计算树上的路径长度.input要去查poj 1984. 任意建一棵树,利用树形结构,将问题转化为u,v,lca(u,v)三个点到根的距离.输出d[u]+d[v]-2*d[lca(u,v)]. 倍增求解 ...

随机推荐

  1. 第一次使用docker for windows 遇到的坑

    原文:第一次使用docker for windows 遇到的坑 1. 目前win10安装docker, 不需要安装其他工具,可直接到官网下载 2. 此版本的docker可同时运行Windows con ...

  2. 【53.90】【BZOJ 3875】 [Ahoi2014]骑士游戏

    Time Limit: 30 Sec Memory Limit: 256 MB Submit: 564 Solved: 304 [Submit][Status][Discuss] Descriptio ...

  3. mount新磁盘

    fdisk -l  mkfs.xfs /dev/xvdb  mkdir /data mount /dev/xvdb /data df -h vi /etc/fstab /dev/xvdb /data ...

  4. C++ 程序延时处理的几种方法

    (—)使用_sleep()函数 例如:_sleep(200);//延时200毫秒 (二)使用delay(int time)函数 (需要自己实现,编译器里面没有) /// @brief      程序延 ...

  5. 【hdu 1536】S-Nim

    Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...

  6. 第六章:任务执行——Java并发编程实战

    任务:通常是一些抽象的且离散的工作单元.大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一.在线程中执行任务 任务的独立性 ...

  7. Framework for Graphics Animation and Compositing Operations

    FIELD OF THE DISCLOSURE The subject matter of the present disclosure relates to a framework for hand ...

  8. Oracle数据库零散知识07 -- Materialized view(转)

    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...

  9. Maven学习笔记(六):生命周期与插件

    何为生命周期:      Maven的生命周期就是为了对全部的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完好的.易扩展的生命周期.这个生命周期包括了项目的清 ...

  10. 常用的iOS开发或者优化的小工具

    下面介绍一下我常用的iOS开发或者优化的小工具 由于很多工具大多数博客都已经介绍过了,我就列举一些我认为还不错但是大家不常列举的: Crafter https://github.com/krzyszt ...