【题解】Luogu P8137 [ICPC2020 WF] ’S No Problem

news/2026/1/14 13:05:55/文章来源:https://www.cnblogs.com/Seqfrel/p/19343836

题目大意

给定一个无向树。有两个扫雪机可以任意选择出发终止点,可以走回头路。求两个扫雪机遍历整个树所需的最短路程。

解题思路

不妨先考虑只有一个扫雪机的情况。

我们知道,在无向树上从任意一个结点出发,将所有的边经过两遍,串成一个环,最终都能回到那个结点。就像这样:

这也就是这一个扫雪机遍历整个树的最坏情况。

但是所有的路我们都走了两遍,很明显我们并不需要这样做,也不需要回到起始节点。于是我们将这个环去除一条路径,剩下的边就构成了一条简单路径,也就是起点和终点不在一个点上的扫雪机路线。并且这个去除的路径一定不能同时包含原图中一条边的两个方向,否则扫雪机就不能到达所有结点。

那么,自然是去除的路径越长,扫雪机所需走的路程就越短。

显然,要去除的就是树的直径。去除后的路径就是一台扫雪遍历完整棵树所需最短路径。就像这样:

接下来就很好办了。既然一台扫雪机的情况我们已经得出,那么将其推广到两台扫雪机甚至 \(k\) 台扫雪机就都不是问题。

上面得出,去除一条最长路径就是一台扫雪机的最短路径,那么去除两条不相交的最长路径就是两台扫雪机的最短路径(相交了就同时去除了原图一条边的两个方向),去除 \(k\) 条不相交最长路径就是 \(k\) 台扫雪机的最短路径。

由此,解法已经得出。

代码实现

显然使用树形DP求解。

深搜这棵树,记录每个结点 \(u\) 的四个状态:

  • \(f_1\):以 \(u\) 为根的子树中,往 \(u\) 结点之上延伸的最长的一条路径
  • \(f_2\):以 \(u\) 为根的子树中,不往 \(u\) 结点之上延伸的最长的一条路径
  • \(f_3\):以 \(u\) 为根的子树中,往 \(u\) 结点之上延伸(当然只能延伸一条)的两条路径
  • \(f_4\):以 \(u\) 为根的子树中,不往 \(u\) 结点之上延伸的两条路径

如果是 \(k\) 台扫雪机,那么就继续往下以此类推。整棵树根 \(root\) 的第 \(2\times k\) 个状态即为 \(k\) 条不相交最长路径的长度和。

不过这些状态之间转移的关系错综复杂,并且对着方程仔细琢磨一下也好理解,于是这里就把所有的方程都列出来(这里 \(u\) 表示子树根节点,\(v\) 表示 \(u\) 的子结点,\(w\) 表示 \(u\)\(v\) 之间边的边权):

\[f_4(u)=\max(f_4(u),f_3(u)+f_1(v)+w) \]

\[f_4(u)=\max(f_4(u),f_2(u)+f_2(v)) \]

\[f_3(u)=\max(f_3(u),f_2(u)+f_1(v)+w) \]

\[f_4(u)=\max(f_4(u),f_1(u)+f3(v)+w) \]

\[f_3(u)=\max(f_3(u),f_1(u)+f_2(v)) \]

\[f_2(u)=\max(f_2(u),f_1(u)+f_1(v)+w) \]

\[f_4(u)=\max(f_4(u),f_4(v)) \]

\[f_3(u)=\max(f_3(u),f_3(v)+w) \]

\[f_2(u)=\max(f_2(u),f_2(v)) \]

\[f_1(u)=\max(f_1(u),f_1(v)+w) \]

这些方程单独写出来固然清晰明白好理解,但是在敲代码的时候非常容易出错。因此 ICPC judge bruce merry 有一份非常巧妙的代码,使用一个双层循环来完成状态的转移,并且可以直接通过修改 \(E\) 的值来求出任意 \(k\) 条不相交最长路径。贴在这里:

static vector<int> recurse(vector<node> &nodes, int cur, int parent, int E) {node &n = nodes[cur];vector<int> dp(E + 1, 0);for (const auto &ch : n.edges) {if (ch.dest == parent) continue;auto sub = recurse(nodes, ch.dest, cur, E);for (int i = E-1; i >= 0; i--)for (int j = E - i; j >= 1; j--) {int score = dp[i] + sub[j] + ((j & 1) ? ch.len : 0);dp[i + j] = max(dp[i + j], score);}}return dp;
}

最后输出二倍边权和减去除的路径总长即可求出答案。

完整代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+10;
struct Node{int to,nxt,w;
}e[2*maxn];
int n,sum,ans;
int h[maxn],tot;
int f1[maxn],f2[maxn],f3[maxn],f4[maxn]; 
void Add(int u,int v,int w){tot++;e[tot].to=v;e[tot].nxt=h[u];e[tot].w=w;h[u]=tot;
} 
void Dfs(int root,int fa){for(int i=h[root];i;i=e[i].nxt){int v=e[i].to;if(v==fa) continue;Dfs(v,root);f4[root]=max(f4[root],f3[root]+f1[v]+e[i].w);f4[root]=max(f4[root],f2[root]+f2[v]);f3[root]=max(f3[root],f2[root]+f1[v]+e[i].w);f4[root]=max(f4[root],f1[root]+f3[v]+e[i].w);f3[root]=max(f3[root],f1[root]+f2[v]);f2[root]=max(f2[root],f1[root]+f1[v]+e[i].w);f4[root]=max(f4[root],f4[v]);f3[root]=max(f3[root],f3[v]+e[i].w);f2[root]=max(f2[root],f2[v]);f1[root]=max(f1[root],f1[v]+e[i].w);}
}
int main(){scanf("%d",&n);for(int i=1;i<=n-1;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);Add(a,b,c);Add(b,a,c);sum+=2*c;}Dfs(1,0);ans=f4[1];cout<<sum-ans;return 0;
} 

注意事项

无向边开二倍数组。

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

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

相关文章

青少年编程学习:考级与竞赛如何平衡

青少年编程学习:考级与竞赛如何平衡 家长最关心的三个编程问题 在青少年编程学习过程中,家长常常面临几个核心困惑: 孩子学习编程,参加等级考试是否有必要? 在众多考试中,NCT和GESP应该如何选择? 如何平衡考级准备与竞赛训练,避免顾此失彼? 一、编程考级的价值:以考…

2025 Autel MaxiVCI V150 Wireless Dongle: CAN FD/DOIP for Autel 900 Series Scanners

The Diagnostic Tool Gap: Modern Vehicles Demand Modern Solutions For European and American automotive professionals and car owners, staying ahead of evolving vehicle technology is a daily challenge. To…

【UI Qt】入门笔记

目录 1、Qt 主要版本发展历程 2、各版本详细对比表 3、底层库对比 4、Qt基类 5、举例 6、QApplication与窗口关联 1、Qt 主要版本发展历程 版本 发布年份 主要特点 当前状态 Qt 1 1995 第一个公开版本&#xff0c;仅支持 Unix/X11 已淘汰 Qt 2 1999 引入信号槽…

WSL安装方法

WSL安装方法 【告别双系统,在Windows上无缝运行Linux,并使用GPU】传统双系统(独立安装 Windows + Linux) 优点:直接运行在硬件上,无性能损失。 缺点:每次切换系统都要重启电脑。虚拟机(VMware / VirtualBox) …

Ubuntu环境中LLaMA Factory 的部署与配置—构建大语言模型微调平台 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【题解】Luogu P8269 [USACO22OPEN] Visits S

思路 容易发现题目给出了一张 \(n\) 个点 \(n\) 条边的有向图,联想到基环树。又因为每个点出度均为一所以是内向基环树。 考虑到题目中的“拜访”类似于拓扑排序,冲突仅存在于环上,所以总边权和去掉环上最小的一条边…

2025贵阳公墓/公益公墓top5推荐!贵阳优质生态陵园榜单发布,合规保障与人文关怀兼具的安息之所推荐 - 全局中转站

引言 随着社会文明的进步和殡葬观念的转变,公众对公墓的选择不再仅关注基本功能,更注重资质合规性、生态环境、服务品质及人文关怀。据中国殡葬协会最新行业报告显示,全国城市经营性公墓合规率约为72%,而同时具备公…

【题解】Luogu P2354 [NOI2014] 随机数生成器

题意 题面花里胡哨。直接看到棋盘那一段,告诉我们 \(K=N\times M\),也就是按给定递推式算出前 \(N\times M\) 项,按规定交换 \(1\sim K\) 的递增序列,最后再按顺序填入 \(N \times M\) 的数表。在上面找排序后字典…

基于Django的农场管理系统

&#x1f345; 作者主页&#xff1a;Selina .a &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作。 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据…

rsync交叉编译步骤

1. 系统环境 1.1 目标系统环境 DISTRIB_ID=OpenWrt DISTRIB_RELEASE=21.02-SNAPSHOT DISTRIB_REVISION=unknown DISTRIB_TARGET=mediatek/mt7988 DISTRIB_ARCH=aarch64_cortex-a53 DISTRIB_DESCRIPTION=OpenWrt 21.02-…

【题解】P11453 [USACO24DEC] Deforestation S

题意 数轴上有 \(n\) 个整点,求最多删除多少个整点,使得 \(k\) 个条件依然满足。每个条件形如:在 \([l_i,r_i]\) 范围内至少存在 \(t_i\) 个整点。 思路 删点操作有悖于满足条件的逻辑,因此正难则反,考虑最少保留…

下载UCI数据集《Secondary Mushroom》

说明:查看代码 1. Title: Primary mushroom data2. Sources:(a) Mushroom species drawn from source book:Patrick Hardin.Mushrooms & Toadstools.Zondervan, 1999(b) Inspired by this mushroom data:Jeff Sch…

03 以上版本 Excel 文件解压替换图片

replace_images_zip_method.ps1 代码如下 param ([Parameter(Mandatory=$true)][string]$ExcelPath,[Parameter(Mandatory=$true)][string]$ImagesFolder,[Parameter(Mandatory=$false)][string]$OutputSuffix = "…

【dl】【WSL2】如何获得“Winux”?Windows 上的 Linux 子系统 —— 比虚拟机更好的选择

准备工作 第一步&#xff1a;确认CPU虚拟化 打开任务管理器——性能&#xff0c;在cpu一栏找“虚拟化”&#xff0c;确认其已开启。一般大部分cpu都是默认开启的。没开启的请自行前往bios修改。第二步&#xff1a;开启两个Windows功能 在任务栏搜索 Windows功能。开启“适用于L…

人机协同重构创作生态——生成式AI赋能内容产业的变革与思考

当内容生产遭遇“产能焦虑”与“创意枯竭”的双重困境&#xff0c;生成式AI正以不可逆转的态势重构行业规则。2025年一季度数据显示&#xff0c;国内72%的内容团队已将AI工具纳入核心工作流&#xff0c;电商文案、短视频脚本等场景的AI渗透率超85%。这场变革不仅是生产效率的提…

【题解】Luogu P13977 数列分块入门 2

思路 动态维护区间信息,考虑线段树。但每次查询的值不固定,如要使用线段树维护,则需针对每个查询的值单独建一棵树,时空复杂度均不可接受。因此考虑分块。 区间加问题类比线段树,只需为每个全包含于区间的块打上懒…

CSS3动画:2D/3D转换全解析

CSS3初体验transition过渡可以为一个元素在不同状态之间切换的时候定义不同的过渡效果。div {width: 200px;height: 200px;background-color: pink;/* div所有的样式发生修改的时候&#xff0c;都有1s的过渡效果 */transition: all 1s; } ​ div:hover {width: 300px; }2D转换t…

AI核心知识50——大语言模型之Scaling Laws(简洁且通俗易懂版)

Scaling Laws (缩放定律) 是目前 AI 领域的“摩尔定律”&#xff0c;也是 OpenAI 等巨头公司敢于投入几百亿美元去训练下一个模型的“信仰之源”。简单来说&#xff0c;它揭示了一个通过大量实验得出的数学规律&#xff1a;只要你按比例增加“模型参数量”、“训练数据量”和“…

MySQL 深分页查询优化实践与经验总结

在企业级项目中&#xff0c;深分页查询经常会成为性能瓶颈。本篇文章总结了我在实践中优化深分页 SQL 的经验&#xff0c;包括 执行计划分析、索引优化、游标分页改写 等内容。一、问题场景假设我们有一张订单表 orders&#xff0c;包含字段&#xff1a;id, user_id, status, t…

理性抉择方可行远——企业AI转型的路径选择与风险管控

数字化浪潮下&#xff0c;AI转型已成为企业提升核心竞争力的必答题。然而现实中&#xff0c;不少企业陷入“转型即烧钱”“技术即万能”的误区&#xff1a;传统制造企业盲目自研大模型&#xff0c;耗费数百万后无功而返&#xff1b;互联网公司一味追求API集成便捷性&#xff0c…