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要简单,因为他不用动态查询.但是我还是错 ...
随机推荐
- FtpClient中文乱码问题解决
最近在做文件服务器的相关东西,在原有的磁盘存储的基础上,增加了Ftp的存储方式,客户端选用的是Apache的FtpClient. 今天在测试的时候,发现中文的路径后者文件名不支持,查阅了相关资料后终 ...
- Java批量文件打包下载zip
网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /* * 另存为 */ @RequestMapping(" ...
- $(this).next()与$(this).children()
$(this).next() 当前元素同级的下个元素,而非子元素 $(this).children() 是当前元素的下一级元素的集合,就是子元素的集合,而不管子元素的后代元素 所以这两个没有什么可比性 ...
- WPF FindName()没找到指定名称的元素
1.FindName()说明,可以用来获取已经注册名称的元素或标签 // // 摘要: // 查找具有提供的标识符名的元素. // // 参数: // name: // 所请求元素的名称. // // ...
- Oracle实用技巧
一. ORACLE SQL PLUS 使用技巧: ----①查找重复记录: SELECT DRAWING, DSNOFROM EM5_PIPE_PREFABWHERE ROWID!= (SELECT ...
- Sublime Text 3运行JavaScript控制台
Node.js是一个基于Chrome JavaScript运行时建立的平台,小巧方便搭建.运行的端口可以在浏览器上运行,显示效果,但每次用浏览器也挺麻烦,我们这里讲的是在sublime text2中配 ...
- Windows程序设计 贪吃蛇c
看Windows程序有段时间了,终于动手写东西.贪吃蛇算是一个开始吧,下面的贪吃蛇很简单,也有很多地方需要修改,还有情况没有考虑QAQ 但这不是我的目的了... 思路很简单:建个链表储存蛇身节点即可. ...
- php学习代码杂记
16/2/22 字符串连接 (1)连接运算符(“.”):它返回将右参数附加到左参数后面所得的字符串. (2)连接赋值运算符(“.=”):它将右边参数附加到左边的参数后. 相当于JS里面的 += . $ ...
- Bootstrap_Javascript_固定定位
Affix 插件可以对任何元素进行固定定位,其中比较简单的方法,就是通过自定义属性 data 来触发.其主要包括两个参数: 1.data-spy:取值 affix,表示元素固定不变的. 2.data- ...
- Yii2的相关学习记录,前后台分离及migrate使用(七)
最近一直忙其它的(其实是懒!),将<深入理解Yii2>看了一遍,一些当初没明白的稍微明了了点,然后又看yii2的图片上传等处理.富文本.restful什么的,但由于没进行到这里,只看也不管 ...