hdu - 2586 (LCA板子题)
(这次的英文题面要比上一个容易看多了)
(英语蒟蒻的卑微)
又是一个很裸的LCA题
(显然,这次不太容易打暴力咧)
(但听说还是有大佬用dfs直接a掉了)
正好
趁这个机会复习一下LCA
这里用的是倍增lca
的思想(一不小心是会写tle的吧)
(也有可能是因为我太弱了才t掉的)
我才不会说我有一次卑微了
一开始看PPT
以为自己明白了
结果发现
有一点点问题
由于本题中这个树是题里给的
所以节点的编号不可以简简单单认为是从上到下从左到右顺序排列的
(但其实这部算什么大问题啊qwq)
(还是我太弱了)
长记性了的我这次记住了要加'\n'
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 40000
using namespace std; struct EDGE
{
int nxt,to,v;
}edge[maxn*+]; int T,n,root,cnt,m;
int head[maxn+],dep[maxn+],dis[maxn+];
int f[maxn+][];
bool vis[maxn+]; void add(int x,int y,int z)
{
edge[++cnt].to=y;
edge[cnt].v=z;
edge[cnt].nxt=head[x];
head[x]=cnt;
} void dfs(int u,int fa)
{
dep[u]=dep[fa]+;
for(int i=; i<=; i++)
{
f[u][i+]=f[f[u][i]][i];
}
for(int i=head[u]; i; i=edge[i].nxt)
{
if(edge[i].to==fa)
{
continue;
}
dis[edge[i].to]=dis[u]+edge[i].v;
f[edge[i].to][]=u;
dfs(edge[i].to,u);
}
} int LCA(int x,int y)
{
if(dep[x]<dep[y])
{
swap(x,y);
}
for(int i=; i>=; i--)
{
if(dep[f[x][i]]>=dep[y])
{
x=f[x][i];
}
if(x==y)
{
return x;
}
}
for(int i=; i>=; i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][];
} int main()
{
scanf("%d",&T);
while(T--)
{
memset(vis,,sizeof(vis));
memset(edge,,sizeof(edge));
memset(f,,sizeof(f));
memset(dep,,sizeof(dep));
memset(head,,sizeof(head));
memset(dis,,sizeof(dis));
cnt=;
scanf("%d%d",&n,&m);
for(int i=; i<=n-; i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
vis[y]=;
add(x,y,z);
add(y,x,z);
}
for(int i=; i<=n; i++)
{
if(vis[i]==)
{
root=i;
break;
}
}
dfs(root,);
for(int i=; i<=m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",dis[a]+dis[b]-*dis[LCA(a,b)]);
}
}
return ;
}
hdu - 2586 (LCA板子题)的更多相关文章
- HDU 2586 (LCA模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 / \ 2 3 ...
- [hdu 2586]lca模板题(在线+离线两种版本)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 在线版本: 在线方法的思路很简单,就是倍增.一遍dfs得到每个节点的父亲,以及每个点的深度.然后 ...
- bzoj-1787-洛谷-4281(LCA板子题)
传送门(bzoj) 传送门(洛谷) 可以说这道也是一个板子题 由于题中是三个人需经过的路径最短 就会有一点点不太一样 那么 就两两求LCA 这样之后就会出现两种状况 一.所得到的三个LCA是相等的 那 ...
- HDU 2586 ( LCA/tarjan算法模板)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:n个村庄构成一棵无根树,q次询问,求任意两个村庄之间的最短距离 思路:求出两个村庄的LCA,d ...
- hdu 2586(LCA在线ST)
How far away ? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...
- HDU 2586 LCA
题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道 ...
- hdu 2586 lca在线算法(朴素算法)
#include<stdio.h> #include<string.h>//用c/c++会爆栈,用g++ac #define inf 0x3fffffff #define N ...
- 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模板题)
HDU - 2586 How far away ? Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
随机推荐
- CentOS7防火墙firewalld设置
添加80端口 重启后永久生效 firewall-cmd --zone=public --add-port=80/tcp --permanent 查看防火墙状态 systemctl status ...
- CSS3 Transform、Transition和Animation属性总结
CSS3的三个与变形和动画啊相关的属性: Transform 浏览器支持情况: Internet Explorer 10.Firefox.Opera 支持 transform 属性. Internet ...
- 关于TensorFlow你需要了解的9件事
关于TensorFlow你需要了解的9件事 https://mp.weixin.qq.com/s/cEQAdLnueMEj0OQZtYvcuw 摘要:本文对近期在旧金山举办的谷歌 Cloud Next ...
- python 正则表达式中反斜杠(\)的麻烦和陷阱
这里是一点小心得:由于下面两个原因,在正则表达式中使用反斜杠就会产生了一个双重转换的问题. (1).python自身处理字符串时,反斜杠是用于转义字符 (2).正则表达式也使用反斜杠来转义字符 ...
- java----鲁棒性
所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性. Java鲁棒性的特点如下: Java在编译和运行程序时都要对可能出现的问题进行检查,以防止错误的产生. Java ...
- Eclipse引入spring约束详细教程
1.打开eclipse的window-preferences,搜索catalog. 2.点击add,点击File System,弹出页面选择spring-beans-4.2.xsd. 3.key ty ...
- June 14. 2018 Week 24th Thursday
Good friends, good books, and a sleepy conscience: this is the ideal life. 拥有益友.良书和一颗宁静的内心:这就是理想的生活. ...
- 设置Firefox自动清除缓存,无需手动清除
1.在firefox的地址栏上输入about:config回车 2.找到browser.cache.check_doc_frequency选项,双击将3改成1保存即可. 那么这个选项每个值都是什么含义 ...
- 注册mySQL到JDBC驱动程序方法浅谈
一.注册方法(4种) 1)服务提供者框架: 符合JDBC 4.0规范的驱动程序包含了一个文件META-INF/services/java.sql.Driver,在这个文件中提供了JDBC驱动实现的类名 ...
- python 浅谈字典dict
一.字典简介 字典(dict)是python中唯一的映射类型,他是以{ }括起来的键值对组成,在dict中的key是唯一的.在保存的时候,根据key来计算出一个内存地址.然后将key-value保存在 ...