HDU2586How far away? LCA
去博客园看该题解
题意
给出一棵树,以及每条边的权值,给出一些询问,每个询问是2个节点,求每个询问对应的2个节点的距离。
算法
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+;
struct Edge{
int cnt,x[N],y[N],z[N],nxt[N],fst[N];
void set(){
cnt=;
memset(x,,sizeof x);
memset(y,,sizeof y);
memset(z,,sizeof z);
memset(nxt,,sizeof nxt);
memset(fst,,sizeof fst);
}
void add(int a,int b,int c){
x[++cnt]=a;
y[cnt]=b;
z[cnt]=c;
nxt[cnt]=fst[a];
fst[a]=cnt;
}
}e,q;
int T,n,m,from,to,dist,in[N],rt,dis[N],fa[N],ans[N];
bool vis[N];
void dfs(int rt){
for (int i=e.fst[rt];i;i=e.nxt[i]){
dis[e.y[i]]=dis[rt]+e.z[i];
dfs(e.y[i]);
}
}
int getf(int k){
return fa[k]==k?k:fa[k]=getf(fa[k]);
}
void LCA(int rt){
for (int i=e.fst[rt];i;i=e.nxt[i]){
LCA(e.y[i]);
fa[getf(e.y[i])]=rt;
}
vis[rt]=;
for (int i=q.fst[rt];i;i=q.nxt[i])
if (vis[q.y[i]]&&!ans[q.z[i]])
ans[q.z[i]]=dis[q.y[i]]+dis[rt]-*dis[getf(q.y[i])];
}
int main(){
scanf("%d",&T);
while (T--){
q.set(),e.set();
memset(in,,sizeof in);
memset(vis,,sizeof vis);
memset(ans,,sizeof ans);
scanf("%d%d",&n,&m);
for (int i=;i<n;i++)
scanf("%d%d%d",&from,&to,&dist),e.add(from,to,dist),in[to]++;
for (int i=;i<=m;i++)
scanf("%d%d",&from,&to),q.add(from,to,i),q.add(to,from,i);
rt=;
for (int i=;i<=n&&rt==;i++)
if (in[i]==)
rt=i;
dis[rt]=;
dfs(rt);
for (int i=;i<=n;i++)
fa[i]=i;
LCA(rt);
for (int i=;i<=m;i++)
printf("%d\n",ans[i]);
}
return ;
}
HDU2586How far away? LCA的更多相关文章
- HDU-2586-How far away(LCA Tarjan离线算法)
链接:https://vjudge.net/problem/HDU-2586 题意: 勇气小镇是一个有着n个房屋的小镇,为什么把它叫做勇气小镇呢,这个故事就要从勇气小镇成立的那天说起了,修建小镇的时候 ...
- hdu-2586-How far away ?(离线LCA)
题意: 给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离. 分析: 这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了. 这里的计算方法是,记下根结点 ...
- hdu2586How far away ?(LCA LCATarjan离线)
题目链接:acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:有n个点,同n-1条带有权值的双向边相连,有m个询问,每个询问包含两个数x,y,求x与y的最短距离. ...
- HDU2586---How far away ?(lca算法)
Problem Description There are n houses in the village and some bidirectional roads connecting them. ...
- hdu2586How far away ?-(LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:有n个点,有n-1条线连通,求两点间的最短距离,最近公共祖先的入门题.Tarjan离线算法. #in ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
随机推荐
- Sq lServer触发器的使用
创建表: CREATE TABLE [dbo].[GeneralRule]( [ID] [int] NOT NULL, ) NULL, [DeleteFlag] [int] NOT NULL ) CR ...
- CodeVs 1009
题意: 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规则(k=2): 2-> ...
- mysql设计表时注意事项
说明:本文是对项目过程中的一些要求的简单汇总整理,主要是供个人本身参考... 一.表设计 1. 在创建表结构时,表名.字段需要见名知意,不采用拼音 create table `tb_abc` ( ...
- IP保留地址
保留地址的网络只能在内部进行通信,而不能与其他网络互连.因为本网络中的保留地址同样也可能被其它网络使用,如果进行网络互连,那么寻找路由时就会因为地址的不唯一而出现问题. 但是这些使用保留地址的网络可以 ...
- centos7编译安装lnmp
1.前言 本文适合于已经对Linux操作系统具有基本操作经验,并且能够在Linux或Windows上通过一键搭建工具或者yum命令行进行环境搭建的读者,阅读本文需具有一定的专业知识,本文不建议初学者阅 ...
- linux_OEL5.4_安装Oracle11g中文教程图解
一.安装ORACLE10g 软件(11.2.0.0) 参考pdf:链接:http://pan.baidu.com/s/1pLHU94J 密码:keo8 (一)安装前的包支持 1. 虚拟机yum 环境搭 ...
- 一道关于js声明变量,var和let的面试题
function aa(flag) { // var test // 变量提升,函数最顶部 if(flag) { var test = 'hello man' } else { //此处访问 test ...
- canvas 保存bitmap到本地
File f = new File("/sdcard/DCIM/Camera/0.png"); FileOutputStream fos = null; try { fos = n ...
- CommonJs、AMD、CMD模块化规范
/** * CommonJS 模块化规范 * CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作 */ /*-------Node.js遵循Commonjs规范----- ...
- jQuery为div添加select和option
简单描述:用jQuery给页面添加select下拉框,直接上图 总结:清楚明了^_^