图文并茂讲解Travelling Salesman

题目

思路

一道lca板子题,不会的同学可以先康康 详解最近公共祖先(LCA)-CSDN博客

我们可以发现,商人是从1开始,旅行到第一个城镇,再到第二个,第三个……

那么我们只需要求出1~第一个城镇的距离,第一个城镇到第二个城镇的距离,第二个城镇到第三个城镇的距离……最后再把这些距离加起来就得到了答案。

那么,如何求树上两点之间的距离呢?

比如画一张图:

其中deep表示该点的深度(1号节点深度为1)

假设要求u到v之间的距离

那么我们把u到v之间的路径标出来

 我们可以发现u到v之间的最短路径是一定会经过lca(u,v)的。

所以,求u->v之间的距离就转化成了求(u->lca(u,v)之间的距离)+(v->lca(u,v)之间的距离)

那么,u到lca(u,v)之间的距离怎么求呢?

其实就是deep[u] - lca(u,v)!(v同理)

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,mx[300001][41],deep[300001],id = 1,ans,a[1000001];
vector<int> vec[300001];
void dfs(int x,int fa)
{deep[x] = deep[fa] + 1;mx[x][0] = fa;for(int i = 0;i < vec[x].size();i++)if(vec[x][i] != fa)dfs(vec[x][i],x);
}
int lca(int x,int y)
{if(deep[x] < deep[y]) swap(x,y);for(int i = 40;i >= 0;i--)if(deep[mx[x][i]] >= deep[y])x = mx[x][i];if(x == y) return x;for(int i = 40;i >= 0;i--)if(mx[x][i] != mx[y][i]){x = mx[x][i];y = mx[y][i];}return mx[x][0];
}
signed main()
{cin>>n;for(int i = 1;i < n;i++){int u,v;cin>>u>>v;vec[u].push_back(v);vec[v].push_back(u);}dfs(1,0);for(int i = 1;i <= 40;i++)for(int j = 1;j <= n;j++)mx[j][i] = mx[mx[j][i - 1]][i - 1];cin>>m;a[0] = 1;for(int i = 1;i <= m;i++){cin>>a[i];ans += deep[a[i]] + deep[a[i - 1]] - deep[lca(a[i],a[i - 1])] * 2;}cout<<ans;return 0;
}

结语

如果这篇博客对您有帮助的话,请点赞支持一下吖!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/454174.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器视觉系统设计:视觉系统中的成像基准

开发视觉系统的一个重要活动是验证其部署是否符合工程规范。一个成功的视觉应用程序的两个特点是它无需工程师干涉情况下正常工作了多长时间&#xff0c;以及它的维护和复制部署是多么简易。实现所有如上所述目标的一个关键步骤是确定视觉系统的基准。 在这里使用的上下文中&a…

第十三篇【传奇开心果系列】Python的OpenCV库技术点案例示例:光流估计

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例:光流估计短博文目录前言一、光流估计介绍二、Lucas-Kanade光流介绍和示例代码三、Horn-Schunck光流介绍和示例代码四、cv::calcOpticalFlowPyrLK()函数实现光流估计介绍和示例代码五、光流估计用于运动分析…

进程的基本概念、查看、创建

1. 进程的概念 概念&#xff1a;加载到内存的程序/正在运行的程序称为内存。 我们在玩电脑的时候是可以启动多个程序的&#xff0c;比如边听歌边写博客&#xff0c;根据上篇文章我们知道肯定要将多个.exe文件加载到内存中&#xff0c;作为操作系统肯定是要管理这多个加载到内存…

LeetCode_19_中等_删除链表的倒数第N个结点

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 计算链表长度2.2 栈 1. 题目 给你一个链表&#xff0c;删除链表的倒数第 n n n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a; h e a d [ 1 , 2 , 3 , 4 , 5 ] , n…

何时用‘x-->?‘将其代入lim中?极限的化简

【何时用‘x-->?将其代入lim中】 【极限的化简】 与极限解法区别&#xff1f; 方法有哪些&#xff1f; 什么条件下可以用&#xff1f; 怎么用&#xff1f;

第三篇:SQL数据模型、通用语法和语法分类

一&#xff0c;SQL数据模型 &#xff08;一&#xff09;关系型数据库&#xff08;RDBMS&#xff09; 1.概念 &#xff08;百度百科&#xff09;指采用了关系模型来组织数据的数据库&#xff0c;其以行和列的形式存储数据&#xff0c;以便于用户理解&#xff0c;关系型数据库这…

华为自动驾驶干不过特斯拉?

文 | AUTO芯球 作者 | 李诞 什么&#xff1f; 华为的智能驾驶方案干不过蔚小理&#xff1f; 特斯拉的智能驾驶[FSD]要甩中国车企几条街&#xff1f; 这华为问界阿维塔刚刚推送“全国都能开”的城区“无图 NCA” 就有黑子来喷了 这是跪久了站不起来了吧 作为玩车14年&…

openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志

文章目录 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志215.1 性能日志概述215.2 性能日志收集的配置参数 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志 215.1 性能日志概述 性能日志主要关注外部资源的访问性能问题。 性能日…

游泳耳机哪个牌子好?四大公认水下音质好的游泳推荐

游泳&#xff0c;一项促进全身健康的锻炼&#xff0c;不仅有益于肺活量的增加&#xff0c;还能提高大脑功能和兴奋度&#xff0c;从而增强体质和提高抗病能力。而在这美妙的运动中&#xff0c;选择合适的耳机&#xff0c;让音乐在水中荡漾&#xff0c;将游泳变得更为愉悦。 在…

【AIGC核心技术剖析】DreamCraft3D一种层次化的3D内容生成方法

DreamCraft3D是一种用于生成高保真、连贯3D对象的层次化3D内容生成方法。它利用2D参考图像引导几何塑造和纹理增强阶段&#xff0c;通过视角相关扩散模型执行得分蒸馏采样&#xff0c;解决了现有方法中存在的一致性问题。使用Bootstrapped Score Distillation来提高纹理&#x…

SpringMVC精简知识点

SpringMVC 数据格式化基本数据类型和字符串自动转换特殊数据类型和字符串自动转换 验证及国际化应用实例注意事项和使用细节注解的结合使用数据类型转换校验核心类-DatBinder取消某个属性的绑定中文乱码解决处理json和HttpMessageConverter<T>作业布置SpringMVC文件上传自…

C#,纽曼-康韦数(Newman Conway Number)的算法与源代码

John Henrry Newman 1 纽曼-康韦数 纽曼-康韦数&#xff08;Newman Conway Number&#xff09;序列是生成以下整数序列的序列。 1 1 2 2 3 4 4 4 5 6 7 7… 在数学上&#xff0c;纽曼-康韦数的序列P&#xff08;n&#xff09;由递推关系定义&#xff1a; (1) P&#xff08…