当前位置: 首页 > news >正文

DeepSeek LeetCode 2646. 最小化旅行的价格总和 C++实现

以下是 LeetCode 2646“最小化旅行的价格总和”的 C++ 实现,思路与 Java 版本一致,采用 DFS 统计节点访问次数 + 树形 DP。

C++ 代码

```cpp
class Solution {
vector<vector<int>> graph;
vector<int> price;
vector<int> count;

// 返回是否存在从 u 到 target 的路径,若存在则累加沿途节点的 count
bool dfsCount(int u, int parent, int target) {
if (u == target) {
count[u]++;
return true;
}
for (int v : graph[u]) {
if (v != parent && dfsCount(v, u, target)) {
count[u]++;
return true;
}
}
return false;
}

// 返回 pair: first = 当前节点不半价的最小总价, second = 当前节点半价的最小总价
pair<int, int> dfs(int u, int parent) {
int notHalf = price[u] * count[u]; // 当前节点不半价
int half = price[u] * count[u] / 2; // 当前节点半价

for (int v : graph[u]) {
if (v == parent) continue;
auto [childNotHalf, childHalf] = dfs(v, u);
notHalf += min(childNotHalf, childHalf); // 父不半价,子可选最优
half += childNotHalf; // 父半价,子必须不半价
}
return {notHalf, half};
}

public:
int minimumTotalPrice(int n, vector<vector<int>>& edges, vector<int>& price, vector<vector<int>>& trips) {
this->price = price;
graph.resize(n);
for (auto& e : edges) {
graph[e[0]].push_back(e[1]);
graph[e[1]].push_back(e[0]);
}

count.assign(n, 0);
for (auto& trip : trips) {
dfsCount(trip[0], -1, trip[1]);
}

auto [rootNotHalf, rootHalf] = dfs(0, -1);
return min(rootNotHalf, rootHalf);
}
};
```

代码说明

1. 统计访问次数
dfsCount 函数递归查找从 start 到 end 的路径,并将路径上所有节点的 count 加 1。
2. 树形 DP
dfs 函数返回 pair<int,int>:
· first:当前节点 不半价 时,子树的最小总代价
· second:当前节点 半价 时,子树的最小总代价
3. 状态转移
· 当前节点不半价 → 子节点可以半价或不半价,取 min
· 当前节点半价 → 子节点 必须不半价
4. 最终答案
对根节点取 min(不半价, 半价)

复杂度分析

· 时间:O(n * m),n 为节点数,m 为路径数(最坏情况每条路径遍历整棵树)
· 空间:O(n),递归栈 + 邻接表

优化提示

如果数据规模较大(例如 n, m <= 10^5),可以使用 LCA + 差分数组 优化路径统计,将单次路径复杂度降为 O(log n)。需要我提供这个优化版本吗?

http://www.jsqmd.com/news/888800/

相关文章:

  • 2026年北京朝阳区搬家公司排行榜多维度测评推荐+避坑指南 - 余小铁
  • iOS真机自动化测试连不上?WebDriverAgent签名与Appium配置深度解析
  • 安全攻防 - 02 标准背景:国际 TLS、RFC 8998 与中国 TLCP
  • Jetson Nano/Orin避坑指南:手把手解决Realsense D435i IMU数据丢失和realsense-viewer黑屏问题
  • Tims天好中国股权曝光:腾讯持股12% 2025年净亏4亿 资金流动性趋紧
  • 从SSC到SEE:高通Sensor架构演进对Android驱动工程师意味着什么?
  • 构建低成本高可用网络爬虫系统:从架构设计到成本控制实战
  • 中国医学科学研究院考研辅导班靠谱推荐:高性价比与良好口碑实力选择 - michalwang
  • 为自托管AI构建安全Shell沙盒:Docker容器隔离实践
  • DeepSeek模型训练数据溯源指南:如何在48小时内完成IP权属链路审计?
  • Android 11 WiFi MAC地址随机化失效了?手把手教你排查与修复(附配置属性详解)
  • 创客匠人:当知识付费遇上AI:学习这件事正在悄悄改变
  • 一篇看懂Linux下的IIC驱动
  • 2026年京东云618活动时间、活动入口、优惠活动详细解读
  • CentOS7 OpenSSL 1.1.1 ABI冲突与安全隔离部署指南
  • HarmonyOS ClickUtil 节流与防抖:彻底搞懂按钮防重复点击
  • 从文本到PDF:极简文档转换工具的技术实现与设计哲学
  • 2026年亲测有效:3种高效降论文AIGC率的方法 - 降AI实验室
  • JMeter高并发压测脚本设计范式:可伸缩、可观测、可诊断
  • 如何快速定位手机号码地理位置:终极开源工具使用指南
  • 从零到一:手把手教你用Playwright+Pytest+Yaml+Allure搭建一个能跑起来的UI自动化框架(保姆级避坑指南)
  • 从零实现五子棋AI:极小化极大算法与Alpha-Beta剪枝实战
  • 2026 年福建莆田全屋高端定制家居设计与选材选型指南
  • 3步解锁百度网盘真实下载速度:告别龟速下载的技术秘籍
  • Java集合全解析:体系架构+分类详解+底层原理+使用场景
  • 01-认知篇-总览-HybridCLR是什么
  • 基于大语言模型的GitHub PR描述自动生成工具设计与实践
  • 微信聊天记录误删别慌!官方恢复方法实操指南
  • 安全攻防 - 03 TLCP 握手:双证书、密码套件与常见术语
  • 用Xilinx Artix-7 FPGA驱动TDC-GPX2:一个完整的状态机SPI控制模块实现