Dis(LCA 双向)

news/2024/7/20 23:14:15 标签: 深度优先, 图论, 算法

题目描述
给出 n 个点的一棵树,多次询问两点之间的最短距离。

注意:边是双向的。

输入格式
第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数;

下来 n-1 行,每行三个整数 x ,y, k,表示点 x 和点 y 之间存在一条边长度为 k;

再接下来 m 行,每行两个整数 x,y,表示询问点 x 到点 y 的最短距离。

输出格式
输出 m 行。对于每次询问,输出一行。

样例 1
Input
2 2
1 2 100
1 2
2 1
Output
100
100
样例 2
Input Output
3 2
1 2 10
3 1 15
1 2
3 2
Output
10
25
数据范围与提示
对于全部数据,2<=n<=10 ^ 4,1<=m<= 2* 10^4,0< k<= 100,1<=x,y<= n.

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int dis[N],father[N],tot,head[N],dep[N],f[N][21];
int n,m,s;
struct node {
	int next,to,dis;
} p[N<<1];
void add(int a,int b,int len) {
	p[++tot].to=b;
	p[tot].next=head[a];
	p[tot].dis=len;
	head[a]=tot;
}
void dfs(int u,int fa) {

	f[u][0]=fa;
	for(int i=1; (1<<i)<=dep[u]; ++i)
		f[u][i]=f[f[u][i-1]][i-1];
	for(int i=head[u]; i; i=p[i].next) {
		if(p[i].to==fa) continue;
		dep[p[i].to]=dep[u]+1;
		dis[p[i].to]=dis[u]+p[i].dis;
		dfs(p[i].to,u);
	}
}
int lca(int x,int y) {
	if(dep[x]>dep[y]) swap(x,y);
	for(int i=20; i>=0; --i)
		if(dep[x]<=dep[y]-(1<<i))
			y=f[y][i];
	if(x==y) return x;
	for(int i=20; i>=0; --i) {
		if(f[x][i]==f[y][i]) continue;
		x=f[x][i];
		y=f[y][i];
	}
	return f[x][0];
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=n-1; ++i) {
		int x,y,l;
		cin>>x>>y>>l;
		add(x,y,l);
		add(y,x,l);
	}
	dfs(1,0);
	for(int i=1; i<=m; ++i) {
		int x,y;
		cin>>x>>y;
		cout<<dis[x]+dis[y]-2*dis[lca(x,y)]<<endl;
	}
	return 0;
}

http://www.niftyadmin.cn/n/1413470.html

相关文章

Android常用代码之APK root权限静默安装

本文主要介绍程序如何利用root权限静默安装(卸载)APK&#xff0c;如何自动选择普通安装(卸载)还是静默安装(卸载)。 1、root权限静默安装(卸载)调用 引入TrineaAndroidCommonGithub(欢迎star和fork^_^)作为你项目的library(如何拉取代码及添加公共库)&#xff0c;或自己抽取Pac…

PID控制器的应用:控制网络爬虫抓取速度

一、初识PID控制器 冬天乡下人喜欢烤火取暖&#xff0c;常见的情形就是四人围着麻将桌&#xff0c;桌底放一盆碳火。有人觉得火不够大&#xff0c;那加点木炭吧&#xff0c;还不够&#xff0c;再加点。片刻之后&#xff0c;又觉得火太大&#xff0c;脚都快被烤熟了&#xff0c;…

石子合并(动态规划)

题目描述  N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。  例如&#xff1a; 1 2 3 4&#xff0c;有不少合并方法  1 2 3 4 > 3…

一个Ext2+SWFUpload做的图片上传对话框

一个Ext2SWFUpload做的图片上传对话框的例程我们先看看对话框的布局&#xff1a; 布局就是在一个窗口里内嵌一个表格控件&#xff0c;窗口的底部工具条带一个进度条&#xff0c;表格的顶部工具条带几个操作按钮和一个下来选择框&#xff0c;底部工具条作为一个信息显示区域显示…

java课程之团队开发冲刺阶段1.4

一.总结昨天进度 1.昨天任务全部完成 二.遇到的问题 1.对数据库的使用陌生 2.使用sqlite有些困难 3.对如何解决查询课程问题暂时没有找到好的解决方案 三.今日任务 1.由于周一的课程比较紧凑&#xff0c;一天只有一节课的时间&#xff0c;所以只能简单学习一下数据库的知识 当日…

能量项链(动态规划)

题目描述 输入格式 诸如此类不能线性规划的问题要用到区间DP&#xff0c;区间DP一般就是三层循环&#xff0c;第一层表示区间长度&#xff08;本题即n&#xff09;&#xff0c;第二层枚举起点并根据第一层区间长度算出区间终点&#xff0c;第三层便在当前区间内枚举决策&#…

用Ext 2.0 combobox 做的省份和城市联动选择框

因项目需要&#xff0c;做了这个&#xff0c;发上来给大家参考一下&#xff0c;呵呵。 刚开始的思路是通过定义好的数组通过combobox的store的loadData方式加载数据&#xff0c;后来发现还不如直接定义好数组格式就是store的格式&#xff0c;然后直接附加到store的data里更简单…

Linux IO调度器

在现代计算机体系中&#xff0c;机械硬盘仍然作为大部分情况下的存储设备使用&#xff0c;而机械硬盘的访问相对内存差了多个数量级&#xff0c;主要原因在于机械臂转动的寻道时间太长&#xff0c;机械操作没法跟上电子信号的传递&#xff0c;所以OS不可能对每次I/O请求都直接作…