题意:

给定一棵树,每条边都有一定的权值,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. css考核点整理(十)-响应式开发经验,响应式页面的三种核心技术是什么

    响应式开发经验,响应式页面的三种核心技术是什么

  2. Java——(九)IO流

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

  3. jQuery注册验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Xcode7插件开发:从开发到拉到恶魔岛

    Xcode很强大,但是有些封闭,官方并没有提供Xcode插件开发的文档.喵神的教程比较全,也比较适合入门.本文的教程只是作为我在开发FKConsole的过程中的总结,并不会很全面. FKConsole ...

  5. 添加Pods后,import无提示的解决办法

    选择工程的 Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"$(PODS_ROOT)" ...

  6. socket.io 实例

    //引用 var io = require('socket.io')(server);   //server io.on('connection', function(socket) {     // ...

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

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

  8. 头一回发博客,来分享个有关C++类型萃取的编写技巧

    废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...

  9. 读书笔记之 - javascript 设计模式 - 组合模式

    组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...

  10. eclipse中show whitespace characters显示代码空格,TAB,回车 导致代码乱恶心

    Eclipse中show whitespace characters显示回车.空格符. 取消此功能的第二种方式: