#Z0424. 树上的旅行
题目
Description
给出一棵有N个结点的树,给出Q个询问,求结点xj过结点K到节点yj的最短距离
Format
Input
第一行一个数n
接下来共有n-1行,三个数u,v,len表示u和v之间存在一条边长为len
再给你Q,K。代表有Q个询问,K就是那个必经过
接下来Q行,每行两个数字xj,yj
N,Q<=1e6
len<=1e9
Output
如题
Samples
输入数据 1
5
1 2 1
1 3 1
2 4 1
3 5 1
3 1
2 4
2 3
4 5
Copy
输出数据 1
3
2
4
注:样例模拟
思路:
这个题是唬人的,既然是一棵树则两点之间的距离是唯一的。只是他还要求经过点k,那么为了方便,我们以k为树根,计算出每个点到k的距离,计为dis[x],则x到y的距离就是 dis[x] + dis[y]。
那么问题来了:我们怎么计算dis呢?一开始我是想用迪杰斯特拉的,但是后来才发现不需要,因为树上两点的距离是固定的,用迪杰斯特拉会有松弛操作,可这里2点之间的距离不会被更新的。所以只要用个dfs从k开始遍历整棵树,并用s记录遍历到目前节点的边的权重之和,每往下遍历一个子节点就把dfs参数中的s加上该边边权即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
/*
pre[i]:对于第i条边来说,它的上一条边是哪一条边
now[x]:对于点x来说,最后一条描述它充当父结点的边是哪一条边
son[i]:在第i条边中,充当子结点的点是哪一个
bq[i]:在第i条边中,边权是多少
*/
int eg,pre[1000001],now[1000001],son[1000001],bq[1000001],n,dis[1000001],q,k;
void dfs(int beg,int fa,int s)//beg:从哪个点开始dfs fa:beg父节点的编号 s:此时从根遍历到beg的权重总和
{dis[beg] = s;for(int i = now[beg]; i; i = pre[i])//遍历beg的子节点if(son[i] != fa)dfs(son[i],beg,s + bq[i]);
}
void adeg(int u,int v,int w)
{pre[++eg] = now[u];bq[eg] = w;now[u] = eg;son[eg] = v;
}
signed main()
{cin>>n;for(int i = 1; i < n; i++){int u,v,w;cin>>u>>v>>w;adeg(u,v,w);adeg(v,u,w);}cin>>q>>k;dfs(k,0,0);while(q--){int a,b;cin>>a>>b;cout<<dis[a] + dis[b]<<endl;}return 0;
}
#Z0424. 树上的旅行相关推荐
- 机器学习 数学_机器学习的数学先决条件
机器学习 数学 Hi everyone, welcome to my second post! This is going to be the continuation from my first p ...
- 在没有专业经验的情况下获得第一份软件工作
I've had a few friends recently ask me about breaking into the software industry. Most have been loo ...
- 威胁建模_现实世界中的威胁建模
威胁建模 Mike Goodwin, VP product security and architecture and Technical Fellow, Sage Sage产品安全与架构副总裁兼技术 ...
- 刷题记录(NC16562 开车旅行)(树上倍增)
NC16562 开车旅行 题目链接 关键点: 1.预处理:将所有点到达另一个点的最短和次短距离先求出 方法:利用set,从最后一个城市开始插入,每次插入到set中,查看左右是否存在有城市(即set是按 ...
- 《商务旅行》解题报告
<商务旅行>解题报告 by mps [题目描述] 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其 ...
- bzoj2746: [HEOI2012]旅行问题
2746: [HEOI2012]旅行问题 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 926 Solved: 295 [Submit][Stat ...
- [SDOI2014]旅行
[SDOI2014]旅行 题意: n个城市,n-1条边,任意两个城市互通,每个城市有所信奉的宗教和城市评级,有四种指令: 1.将城市x的居民改信为c教 2.将城市x的评级调整为w 3.统计x到y,路上 ...
- 迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])
快速简单记录老师口胡(可能就我自己看得懂了吧-) 文章目录 T1:舞踏会 title solution code T2:HH去散步 title solution code T3:排序 title so ...
- [bzoj3531][Sdoi2014]旅行
S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们用不同的 ...
最新文章
- 攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗
- 查看当前正在运行的python进程
- mysql計劃任務_MySQL計劃任務 | 學步園
- javascript11-object03-extend
- 转载--线程同步机制及比较
- 1---结构体中最后一个成员为[0]长度数组的用法
- boost::io::ostream_joiner模块相关的测试程序
- Java并发(十九):final实现原理
- 在eclipse中创建第一个java应用程序,并在控制台输出“hello world”。
- 使用Prometheus发现在Kubernetes上运行的应用程序
- MySQL 5.7.18忘记密码和密码过期解决
- python爬虫之app数据抓取实战_Python爬虫工程师必学——App数据抓取实战 ??
- VIM和sed 替换字符串方法
- win7电脑怎么设置桌面便签
- 下周出发去印度:直觉之旅,发现自己
- 蘑菇战争2显示没有连接服务器,蘑菇战争2新手怎么玩?四步带你解决新手难关[多图]...
- python基础教程第4版pdf百度云-Python入门书籍电子版PDF百度云网盘免费下载
- 【转】Java方向如何准备BAT技术面试答案(汇总版)
- 关于电脑连不上WiFi,但可以连上网线的解决办法
- Vue 使用XLSX导出excel,并且设置标题背景颜色、字体、居中。并且在前端导出成excel文件