【洛谷 P8602】[蓝桥杯 2013 省 A] 大臣的旅费 题解(图论+深度优先搜索+树的直径+链式前向星)

news2024/11/25 0:31:27

[蓝桥杯 2013 省 A] 大臣的旅费

题目描述

很久以前,T 王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

为节省经费,T 国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

J 是 T 国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了 J 最常做的事情。他有一个钱袋,用于存放往来城市间的路费。

聪明的 J 发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第 x x x 千米到第 x + 1 x+1 x+1 千米这一千米中( x x x 是整数),他花费的路费是 x + 10 x+10 x+10 这么多。也就是说走 1 1 1 千米花费 11 11 11,走 2 2 2 千米要花费 23 23 23

J 大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

输入格式

输入的第一行包含一个整数 n ( n ≤ 1 0 5 ) n(n \le 10^5) n(n105),表示包括首都在内的 T T T 王国的城市数。

城市从 1 1 1 开始依次编号, 1 1 1 号城市为首都。

接下来 n − 1 n-1 n1 行,描述 T T T 国的高速路( T T T 国的高速路一定是 n − 1 n-1 n1 条)。

每行三个整数 P i , Q , D i P_i,Q,D_i Pi,Q,Di,表示城市 P i P_i Pi 和城市 Q i Q_i Qi 之间有一条高速路,长度为 D i ( D i ≤ 1000 ) D_i(D_i \le 1000) Di(Di1000) 米。

输出格式

输出一个整数,表示大臣J最多花费的路费是多少。

样例 #1

样例输入 #1

5
1 2 2
1 3 1
2 4 5
2 5 4

样例输出 #1

135

提示

样例解释:大臣 J 从城市 4 4 4 到城市 5 5 5 要花费 135 135 135 的路费。

时限 5 秒, 64M。蓝桥杯 2013 年第四届省赛


思路

这个图是一棵树。树是一种特殊的图,它是无环的连通图。“连通"意味着图中的任意两个节点都存在一条路径相连,这对应了题目中的"任何一个大城市都能从首都直接或者通过其他大城市间接到达”。“无环"则意味着图中不存在闭合的路径,这对应了题目中的"如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的”。

树的直径定义为树中所有最短路径的最大值,也就是树中最远的两个节点之间的距离。在无向树中,最远的两个节点一定是叶子节点,也就是只有一个邻居的节点。

首先从树中任意一个节点开始,进行一次深度优先搜索,找到最远的节点。然后,从这个节点开始再进行一次深度优先搜索,找到最远的节点。这两个节点之间的距离就是树的直径。

首先,定义一些常量和类型,包括节点的最大数量(N),无穷大(INF),模数(MOD),以及一些类型别名如长整型(ll)和长整型对(pll)。

然后,定义一个全局变量n用来存储城市的数量。定义一个结构体Snode,用来表示边,包括目标节点(to),边的长度(d)和下一条边的索引(next)。定义一个数组edge用来存储所有的边,一个数组head用来存储每个节点的第一条边的索引,一个变量cnt用来计数边的数量。

接着,定义一个函数add,用来向邻接链表中添加边。函数接受两个节点和一条边的长度作为参数,然后将这条边添加到邻接链表中。

然后,定义一个函数dfs,用来进行深度优先搜索。函数接受一个节点和它的父节点作为参数,然后返回一个长整型对,其中第一个元素是该节点到达的最远节点,第二个元素是最远的距离。在函数中,遍历该节点的所有边,如果边的目标节点不是父节点,则对目标节点进行深度优先搜索,并更新最远的节点和距离。

在主函数中,首先初始化头结点,然后从输入中读取城市的数量和所有的边。接着,从首都开始进行一次深度优先搜索,找到最远的节点,然后从这个节点开始再进行一次深度优先搜索,找到最远的距离。最后,根据题目的要求,计算并输出最多的路费。


AC代码

#include <algorithm>
#include <cstring>
#include <iostream>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;

int n;

struct Snode {
	int to;
	int d;
	int next;
} edge[N];
int head[N];
int cnt = 0;

void add(int u, int v, int d) {
	edge[cnt] = {v, d, head[u]};
	head[u] = cnt++;
}

pll dfs(int x, int fa) {
	// cout << x << endl;
	pll ret = {x, 0};
	for (int i = head[x]; ~i; i = edge[i].next) {
		int to = edge[i].to;
		if (to == fa) {
			continue;
		}
		pll t = dfs(to, x);
		ll d = t.second + edge[i].d;
		if (ret.second < d) {
			ret = {t.first, d};
		}
	}
	return ret;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	memset(head, -1, sizeof(head));

	cin >> n;
	for (int i = 1; i < n; i++) {
		int p, q, d;
		cin >> p >> q >> d;
		add(p, q, d);
		add(q, p, d);
	}
	int f = dfs(1, 0).first;
	ll dmax = dfs(f, 0).second;
	cout << (((1 + dmax) * dmax / 2) + dmax * 10);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uv 必备的工具 ps ai 全家桶合集

非常稀有的资源 &#xff0c;必应搜索 易品资源yipinziyuan 可以找到

浅谈如何自我实现一个消息队列服务器(1)——需求分析

文章目录 一、什么是消息队列&#xff1f;二、当下主流的消息队列(MQ)三、自我实现一个消息队列服务器的前期准备——需求分析3.1 核心概念3.2 broker server 核心概念3.2.1、虚拟主机&#xff08;Virtual Host&#xff09;3.2.2、交换机&#xff08;Exchange&#xff09;3.2.2…

如何构建Docker自定义镜像

说明&#xff1a;平常我们使用Docker运行各种容器&#xff0c;极大地方便了我们对开发应用的使用&#xff0c;如MySQL、Redis&#xff0c;以及各种中间件&#xff0c;使用时只要拉镜像&#xff0c;运行容器即可。本文介绍如何创建一个Demo&#xff0c;自定义构建一个镜像。 开…

基于 K8s 容器集群的容灾架构与方案

作者&#xff1a;庄宇 在设计系统架构时&#xff0c;我们必须假设任何组件和任何基础设施可能会在任何时间失效&#xff0c;例如&#xff1a;自然灾害&#xff0c;电力中断&#xff0c;网络中断&#xff0c;错误的系统变更等。为了应对挑战&#xff0c;我们必须设计合适的容灾…

HTML基础:head头部标签包含的8种形式详解

你好&#xff0c;我是云桃桃。 HTML <head> 标签用于定义文档的头部&#xff0c;包含了一些元数据和引用的外部资源&#xff0c;但并不会直接展示在页面上。<head> 标签位于 <html> 标签内部&#xff0c;紧跟在 <html> 开始标签之后&#xff0c;在 &l…

贪心算法(两个实例)

例一&#xff1a;调度问题 问题&#xff1a;由n项任务&#xff0c;每项任务的加工时间已知&#xff0c;从零时刻开始陆续加入一台机器上去加工&#xff0c;每个任务完成的时间是从0时刻到任务加工截至的时间。 求总完成时间&#xff08;所有任务完成时间最短计划方案&#xf…

C语言字符函数和字符串函数详解

Hello, 大家好&#xff0c;我是一代&#xff0c;今天给大家带来有关字符函数和字符串函数的有关知识 所属专栏&#xff1a;C语言 创作不易&#xff0c;望得到各位佬们的互三呦 一.字符函数 在C语言中有一些函数是专门为字符设计的&#xff0c;这些函数的使用都需要包含一个头文…

SQLiteC/C++接口详细介绍之sqlite3类(十七)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;十八&#xff09; ​ 53.sqlite3_trace_v2 函数功能&#x…

EXCEL+PYTHON学习3

1&#xff09; 遍历一个SHEET&#xff0c;无非就是两个循环&#xff0c;rows属性是取得所有行。 fn data3_16.xlsx wb openpyxl.load_workbook(fn) ws wb.active for row in ws.rows:for cell in row:print(cell.value, end )print() 2&#xff09; 返回工作表的最小行数…

【Leetcode-54.螺旋矩阵】

题目&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1…

Day38:安全开发-JavaEE应用SpringBoot框架MyBatis注入Thymeleaf模版注入

目录 SpringBoot-Web应用-路由响应 SpringBoot-数据库应用-Mybatis SpringBoot-模版引擎-Thymeleaf 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

基于springboot实现房源出租信息系统项目【项目源码+论文说明】

基于springboot实现房源出租信息系统演示 摘要 近些年来在一线城市的房子需求量在逐步递增&#xff0c;其中租房子和出租房子的需求业务不断增加。那么租房对于我们一线二线城市来说是一个非常大&#xff0c;而且具有经济提升能力的业务场景。那么信息技术在此行业的加持早已是…

JavaWeb--HTML

一&#xff1a;HTML简介 *HTML是一门语言&#xff0c;所有的网页都是用HTML这门语言编写出来的&#xff1b; *HTML&#xff1a;超文本标记语言&#xff1b; 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff0c;还能定义图片&#xff…

展开说说:Android之SharedPreferences

SharedPreferences 是一种轻量级的数据持久化存储机制。以key/value键值对形式存储在xml文件&#xff0c;用于保存一些应用程序数据。保存在 /data/data/PACKAGE_NAME/shared_prefs/xxx.Xml文件。 SharedPreferences 只能存储string&#xff0c;int&#xff0c;float&#xff…

visual studio2019项目中引入头文件失效问题的解决

这几天把项目整理一下&#xff0c;但在引入头文件过程中非常曲折。 项目本身写好了可以运行&#xff0c;但是项目结构是这样的&#xff1a; 所以想把功能模块化&#xff0c;同一类协议功能放在一起。 于是建包&#xff0c;创建文件&#xff0c;导入头文件&#xff1a; 在新…

瑞熙贝通打造智慧校园实验室安全综合管理平台

一、建设思路 瑞熙贝通实验室安全综合管理平台是基于以实验室安全&#xff0c;用现代化管理思想与人工智能、大数据、互联网技术、物联网技术、云计算技术、人体感应技术、语音技术、生物识别技术、手机APP、自动化仪器分析技术有机结合&#xff0c;通过建立以实验室为中心的管…

zookeeper基础学习之六: zookeeper java客户端curator

简介 Curator是Netflix公司开源的一套zookeeper客户端框架&#xff0c;解决了很多Zookeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt&#xff08;Zookeeper&#xff09;以一句“Guava is to Java…

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

目录 1. 分类和简介 2. 公共组件 2.1 创建 2.2 注册 2.3 使用 3. 页面组件 3.1 创建 3.2 注册 3.3 使用 4. 组件的数据和方法的使用 4.1 组件数据的修改 4.2 方法事件的使用 1. 分类和简介 小程序目前已经支持组件化开发&#xff0c;可以将页面中的功能…

【PyTorch】基础学习:一文详细介绍 torch.load() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 torch.load() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

基于Android Studio的小米便签App的代码泛读结对心得体会

本次实验我本来最开始使用的是2023.2.1.23的Android studio版本&#xff0c;但是在选择项目的时候没有编程语言为java的选项导致导入项目之后运行不起来。 创建完项目之后默认的代码块是MainActivity.kt&#xff0c;这里面不能编写java代码 所以我选择了退版本退到21海豚版本…