题意:

给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离。

分析:

这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了。

这里的计算方法是,记下根结点到任意一点的距离dis[],这样ans = dis[u] + dis[v] - 2 * dis[lca(v, v)]。

// File Name: 2586.cpp
// Author: Zlbing
// Created Time: 2013年08月19日 星期一 10时59分47秒
#pragma comment(linker,"/STACK:102400000,102400000")
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
using namespace std;
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 0x3f3f3f3f
#define LL long long
#define REP(i,r,n) for(int i=r;i<=n;i++)
#define RREP(i,n,r) for(int i=n;i>=r;i--)
const int MAXN=4e4+;
struct Edge
{
int u,v,cost;
Edge()
{
}
Edge(int u,int v,int cost):u(u),v(v),cost(cost)
{
}
};
vector<Edge> edges;
vector<Edge> qedges;
vector<int> G[MAXN],Q[MAXN];
int vis[MAXN];
int dis[MAXN];
int in[MAXN];
int f[MAXN];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
void LCA(int u,int fa)
{
for(int i=;i<(int)G[u].size();i++)
{
Edge e=edges[G[u][i]];
if(e.v==fa)continue;
dis[e.v]=dis[u]+e.cost;
LCA(e.v,u);
f[find(e.v)]=u;
}
vis[u]=;
for(int i=;i<(int)Q[u].size();i++)
{
Edge& e=qedges[Q[u][i]];
if(vis[e.v])
{
int ancestor=find(e.v);
qedges[Q[u][i]].cost=dis[e.v]+dis[e.u]-*dis[ancestor];
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
REP(i,,n)
{
G[i].clear();
Q[i].clear();
vis[i]=;
dis[i]=;
in[i]=;
f[i]=i;
}
edges.clear();
qedges.clear();
int a,b,c;
REP(i,,n-)
{
scanf("%d%d%d",&a,&b,&c);
in[b]++;
edges.push_back(Edge(a,b,c));
edges.push_back(Edge(b,a,c));
int mm=edges.size();
G[a].push_back(mm-);
G[b].push_back(mm-);
}
REP(i,,m)
{
scanf("%d%d",&a,&b);
qedges.push_back(Edge(a,b,-));
qedges.push_back(Edge(b,a,-));
int mm=qedges.size();
Q[a].push_back(mm-);
Q[b].push_back(mm-);
}
for(int i=;i<=n;i++)
{
if(!in[i])
LCA(i,-);
}
for(int i=;i<(int)qedges.size();i++)
{
Edge e=qedges[i];
if(e.cost!=-)
{
printf("%d\n",e.cost);
}
}
}
return ;
}

hdu-2586-How far away ?(离线LCA)的更多相关文章

  1. hdu 2586 How far away ? ( 离线 LCA , tarjan )

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. hdu 2586 How far away?(LCA模板题+离线tarjan算法)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. 【HDU 2586 How far away?】LCA问题 Tarjan算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵n个节点的无根树,每条边有各自的权值.给出m个查询,对于每条查询返回节点u到v的最 ...

  4. HDU 2586 How far away ? (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...

  5. HDU 2586 How far away ? (LCA,Tarjan, spfa)

    题意:给定N个节点一棵树,现在要求询问任意两点之间的简单路径的距离,其实也就是最短路径距离. 析:用LCA问题的Tarjan算法,利用并查集的优越性,产生把所有的点都储存下来,然后把所有的询问也储存下 ...

  6. Hdu 2586 树链剖分求LCA

    Code: #include<cstdio> #include<cstring> #include<vector> #include<algorithm> ...

  7. hdu 2586 How far away? (LCA模板)

    题意: N个点,形成一棵树,边有长度. M个询问,每个询问(a,b),询问a和b的距离 思路: 模板题,看代码.DFS预处理算出每个结点离根结点的距离. 注意: qhead[maxn],而不是qhea ...

  8. LCA(最近公共祖先)--tarjan离线算法 hdu 2586

    HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  9. HDU 2586 How far away ? 离线lca模板题

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  10. HDU 5044 离线LCA算法

    昨天写了HDU 3966 ,本来这道题是很好解得,结果我想用离线LCA 耍一把,结果发现离线LCA 没理解透,错了好多遍,终得AC ,这题比起 HDU 3966要简单,因为他不用动态查询.但是我还是错 ...

随机推荐

  1. windows 与Linux 互传文件

    下载putty,将putty的安装路径添加到Windows的环境变量中:     我的电脑->属性->高级->环境变量->系统变量,双击其中的Path,在分号后添加putty的 ...

  2. Android内存优化之——static使用篇(使用MAT工具进行分析)

    这篇文章主要配套与Android内存优化之——static使用篇向大家介绍MAT工具的使用,我们分析的内存泄漏程序是上一篇文章中static的使用内存泄漏的比较不容易发现泄漏的第二情况和第三种情况—— ...

  3. Android微信智能心跳方案

    前言:在13年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和WhatsApp的心跳机制进行分析.我和春哥抓包测试了差不多两个多礼拜 ...

  4. Java——(九)IO流

    一.流的分类 1.输入流和输出流 按照流的流向来分,可以分为输入流和输出流 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 此处的输入.输出涉及一个方向 ...

  5. jsp页面表单的遍历要怎么写

    1.传统的方式使用request.getAttribute(“list”);获取表单的值, 2.也可以用struts2提供的标签进行遍历 备注 // 传统的接受参数方法 // String sfz=t ...

  6. PHP 正则表达式匹配 preg_match 与 preg_match_all 函数

    --http://www.5idev.com/p-php_preg_match.shtml 正则表达式在 PHP 中的应用 在 PHP 应用中,正则表达式主要用于: 正则匹配:根据正则表达式匹配相应的 ...

  7. LINQ to SQL 运行时动态构建查询条件

    在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功能,从Nor ...

  8. sql yog注册码

    Name: AnyRegistration Code: 26f359fc-e3f6-4727-8af1-72a1a4a0819d

  9. What's the use of @ before the path defination

    When you define your path const : const string Child_Medical_Pdf = @"~/Media/ChildPdf"; Th ...

  10. Vijos1386 IOI2007 矿工配餐 动态规划

    感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了 状态用dp[n][a1][b1][a2][b2]表示 n表示处理到前n个餐车 第一组矿工得到的最近一种食物用a1表示,a1的上一种食物 ...