hdu-2586-How far away ?(离线LCA)
题意:
给定一棵树,每条边都有一定的权值,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)的更多相关文章
- 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 ...
- 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 ...
- 【HDU 2586 How far away?】LCA问题 Tarjan算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵n个节点的无根树,每条边有各自的权值.给出m个查询,对于每条查询返回节点u到v的最 ...
- HDU 2586 How far away ? (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...
- HDU 2586 How far away ? (LCA,Tarjan, spfa)
题意:给定N个节点一棵树,现在要求询问任意两点之间的简单路径的距离,其实也就是最短路径距离. 析:用LCA问题的Tarjan算法,利用并查集的优越性,产生把所有的点都储存下来,然后把所有的询问也储存下 ...
- Hdu 2586 树链剖分求LCA
Code: #include<cstdio> #include<cstring> #include<vector> #include<algorithm> ...
- hdu 2586 How far away? (LCA模板)
题意: N个点,形成一棵树,边有长度. M个询问,每个询问(a,b),询问a和b的距离 思路: 模板题,看代码.DFS预处理算出每个结点离根结点的距离. 注意: qhead[maxn],而不是qhea ...
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU 2586 How far away ? 离线lca模板题
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 5044 离线LCA算法
昨天写了HDU 3966 ,本来这道题是很好解得,结果我想用离线LCA 耍一把,结果发现离线LCA 没理解透,错了好多遍,终得AC ,这题比起 HDU 3966要简单,因为他不用动态查询.但是我还是错 ...
随机推荐
- css考核点整理(十)-响应式开发经验,响应式页面的三种核心技术是什么
响应式开发经验,响应式页面的三种核心技术是什么
- Java——(九)IO流
一.流的分类 1.输入流和输出流 按照流的流向来分,可以分为输入流和输出流 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 此处的输入.输出涉及一个方向 ...
- jQuery注册验证
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Xcode7插件开发:从开发到拉到恶魔岛
Xcode很强大,但是有些封闭,官方并没有提供Xcode插件开发的文档.喵神的教程比较全,也比较适合入门.本文的教程只是作为我在开发FKConsole的过程中的总结,并不会很全面. FKConsole ...
- 添加Pods后,import无提示的解决办法
选择工程的 Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"$(PODS_ROOT)" ...
- socket.io 实例
//引用 var io = require('socket.io')(server); //server io.on('connection', function(socket) { // ...
- Vijos1386 IOI2007 矿工配餐 动态规划
感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了 状态用dp[n][a1][b1][a2][b2]表示 n表示处理到前n个餐车 第一组矿工得到的最近一种食物用a1表示,a1的上一种食物 ...
- 头一回发博客,来分享个有关C++类型萃取的编写技巧
废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...
- 读书笔记之 - javascript 设计模式 - 组合模式
组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...
- eclipse中show whitespace characters显示代码空格,TAB,回车 导致代码乱恶心
Eclipse中show whitespace characters显示回车.空格符. 取消此功能的第二种方式: