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 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...
随机推荐
- Linux Crontab 定时任务使用总结
任务调度的crond常用命令 crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此任务调度命令.crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便 ...
- 14.5.7 Storing InnoDB Undo Logs in Separate Tablespaces 存储InnoDB Undo logs 到单独的表空间
14.5.7 Storing InnoDB Undo Logs in Separate Tablespaces 存储InnoDB Undo logs 到单独的表空间 在MySQL 5.6.3,你可以存 ...
- Linux vmstat命令详解
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...
- ssh登录过程详细介绍
服务器端和客户端就取得了相同的会话密钥和会话 ID .对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全. http://blog.csdn.net/lhq9220/arti ...
- POJ2112_Optimal Milking(网洛流最大流Dinic+最短路Flody+二分)
解题报告 农场有k个挤奶机和c头牛,每头牛到每一台挤奶机距离不一样,每台挤奶机每天最多挤m头牛的奶. 寻找一个方案,安排每头牛到某一挤奶机挤奶,使得c头牛须要走的全部路程中的最大路程的最小值. 要使每 ...
- C语言中字符串如何转换为二进制、八进制、十进制、十六进制
在C语言某个程序当中需要把文本16进制转换成对应的16进制数,比如字符串"0x1a"转换成10进制的26,可以用以下函数来实现 相关函数: atof, atoi, atol, st ...
- 手机定位原理 - GPS/GLONASS/北斗 + WIFI + 基站(转)
卫星定位系统 - GPS/GLONASS/北斗: 关于GPS.GLONASS.北斗.伽利略系统的科普请自行谷歌. GPS是使用最广泛的全球定位网络,几乎是所有智能手机的标配.进几年,俄罗斯的GLONA ...
- html5css3杂记
最新版本号的safari.chrome.firefox以及opera支持某些html5特性.ie9将支持某些html5特性. html5提供了展现视频的标准<video>支持ogg及mpe ...
- 乞讨N!到底有多少0
分析: 对N质因数分解 N=2^x * 3^y * 5^z....因为10 = 2*5,所以末尾0的个数仅仅和x与z有关,每一对2和5相乘能够得到一个10.于是末尾0的个数=min(x,z).在实际中 ...
- unix解释器文件详解
exec执行普通文件和解释器文件的区别 2014-11-15 23:52:45 分类: LINUX exec执行普通文件和解释器文件的区别 ——lvyilong316 1. 从一个问题开始 首先要从项 ...