HDU ACM 2586 How far away ?LCA->并查集+Tarjan(离线)算法
题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w。有m次询问,每次询问房子a,b之间的距离是多少。
分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次询问a。b之间的距离=d[a]+d[b]-2*d[LCA(a,b)];LCA(a,b)是a,b的近期公共祖先。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<vector>
using namespace std; #define N 50005
vector<int> map[N],w[N],query[N],num[N];
int p[N],d[N],res[N];
bool vis[N];
int n; void Init()
{
int i;
for(i=1;i<=n;i++)
{
map[i].clear();
w[i].clear();
query[i].clear();
num[i].clear();
p[i]=i;
d[i]=0;
vis[i]=false;
}
} int Find(int x)
{
if(p[x]!=x)
p[x]=Find(p[x]);
return p[x];
} void Union(int x,int y)
{
x=Find(x);
y=Find(y);
if(x!=y)
p[y]=x;
} void Tarjan(int cur,int v)
{
int size,i,tmp; vis[cur]=true;
d[cur]=v;
size=map[cur].size();
for(i=0;i<size;i++)
{
tmp=map[cur][i];
if(vis[tmp]) continue;
Tarjan(tmp,v+w[cur][i]);
Union(cur,tmp);
}
size=query[cur].size();
for(i=0;i<size;i++)
{
tmp=query[cur][i];
if(!vis[tmp])continue;
res[num[cur][i]]=d[cur]+d[tmp]-2*d[Find(tmp)];
}
} int main()
{
int T,q,a,b,c,i; scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&q);
Init();
for(i=1;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a].push_back(b);
w[a].push_back(c);
map[b].push_back(a);
w[b].push_back(c);
}
for(i=0;i<q;i++)
{
scanf("%d%d",&a,&b);
query[a].push_back(b);
query[b].push_back(a);
num[a].push_back(i);
num[b].push_back(i);
}
Tarjan(1,0);
for(i=0;i<q;i++)
printf("%d\n",res[i]);
}
return 0;
}
HDU ACM 2586 How far away ?LCA->并查集+Tarjan(离线)算法的更多相关文章
- LCA最近公共祖先(Tarjan离线算法)
这篇博客对Tarjan算法的原理和过程模拟的很详细. 转载大佬的博客https://www.cnblogs.com/JVxie/p/4854719.html 第二次更新,之前转载的博客虽然胜在详细,但 ...
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- LCA问题的ST,tarjan离线算法解法
一 ST算法与LCA 介绍 第一次算法笔记这样的东西,以前学算法只是笔上画画写写,理解了下,刷几道题,其实都没深入理解,以后遇到新的算法要把自己的理解想法写下来,方便日后回顾嘛>=< R ...
- 最近公共祖先LCA Tarjan 离线算法
[简介] 解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问.换句话说,要所有询问都读入后才开始计算,所以是一种离线的算法. [原理] 先来看这样一个性质:当两个节点 ...
- LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现
首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...
- Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)
Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...
- HDU 3081 Marriage Match II (二分图,并查集)
HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...
- hdu 2586(Tarjan 离线算法)
How far away ? Time Limi ...
- HDU 1512 Monkey King(左偏树+并查集)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1512 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...
随机推荐
- Hacker News网站的文章排名算法工作原理
In this post I'll try to explain how Hacker News ranking algorithm works and how you can reuse it in ...
- Swift - 带结果列表的搜索条(UISearchDisplayController)的用法
(注:自iOS8起,苹果便废弃UISearchDisplayController的使用,改为使用UISearchController来实现类似功能,可参考我的另一篇文章“Swift - 使用UISea ...
- 可运行jar包调用exe可运行文件,子进程阻塞
背景: 须要在项目的測试工具中加入一个button,点击后直接打开某exe工具. 这个工具的功能是导入txt文件,转为excel报表输出. 无奈解析了两行之后就停止不动了,也不报错.关闭測试工具后,就 ...
- 获取sina,baidu,google财经历史和实时股票数据接口
实时股票数据接口 股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口1.http/javascript接口取数据1.1Sina股票 ...
- 王垠:Lisp 已死,Lisp 万岁!
王垠:Lisp 已死,Lisp 万岁!_IT新闻_博客园 王垠:Lisp 已死,Lisp 万岁!
- Delphi对WM_NCHITTEST消息的处理
前提:WM_NCHITTEST是很重要的,只要鼠标在活动,Windows无时无刻在发这个消息进行探测. ------------------------------------------------ ...
- <Win32_17>集音频和视频播放功能于一身的简易播放器
前段时间,在学习中科院杨老师的教学视频时,他说了一句话: "我很反对百八十行的教学程序,要来就来一个完整的程序" 对此,我很是赞同.所谓真刀真枪的做了,你才会发现其中的奥秘——然而 ...
- Storyboard 经常用法总结-精华版
1.prepareForSegue: Now we know what the destinationViewController is we can set its data properties. ...
- GitLab 5.3 升级注意事项
最主要就是需要更新的Git.我的Ubuntu12.04通过apt-get install安装的git版本过低. 所以只能通过源代码安装. 参考下面的步骤: wget git-core.googleco ...
- SRM 638 Div2
2333... 因为TC过少的参与者.加上不断fst 我掉了div2该. 幸运的是完成的背div1该.. 250 水的问题 500 水的问题.. 直接bfs扩展即可了 注意判重. 我还用康托展开了真 ...