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

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

这是 LeetCode 第 2646 题“最小化旅行的价格总和”的 Java 实现,核心思路是 DFS + 树形动态规划。

解题思路

1. 统计节点访问次数:对于每条路径 (start, end),通过 DFS 找到路径并累加该路径上所有节点的访问次数。
2. 定义 DP 状态:对每个节点 u:
· dp[u][0]:不半价时,以 u 为根的子树的最小总代价
· dp[u][1]:半价时,以 u 为根的子树的最小总代价
3. 状态转移:如果 u 半价,则子节点不能半价;如果 u 不半价,子节点可以半价或不半价,取较小值。
4. 最终结果:min(dp[root][0], dp[root][1])

Java 代码

```java
class Solution {
List<Integer>[] graph;
int[] price;
int[] count; // 每个节点被访问的次数

public int minimumTotalPrice(int n, int[][] edges, int[] price, int[][] trips) {
this.price = price;
graph = new List[n];
for (int i = 0; i < n; i++) graph[i] = new ArrayList<>();
for (int[] e : edges) {
graph[e[0]].add(e[1]);
graph[e[1]].add(e[0]);
}

count = new int[n];
for (int[] trip : trips) {
// 统计路径上的节点次数
dfsCount(trip[0], -1, trip[1]);
}

int[] res = dfs(0, -1);
return Math.min(res[0], res[1]);
}

// 返回从 u 到 target 的路径是否存在,若存在则累加沿途节点
private boolean 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;
}

// 返回 int[2]: 0-不半价最小总价, 1-半价最小总价
private 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;
int[] childRes = dfs(v, u);
notHalf += Math.min(childRes[0], childRes[1]); // 父不半价,子可选
half += childRes[0]; // 父半价,子必须不半价
}
return new int[]{notHalf, half};
}
}
```

复杂度分析

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

优化建议(可选)

如果 n 和 m 都很大,可以先用 LCA(最近公共祖先) 优化路径统计,将 dfsCount 的 O(n) 单次路径降为 O(log n),总复杂度变为 O((n + m) log n)。本题数据规模较小,上述解法已足够。

需要我给出 LCA 优化的版本吗?

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

相关文章:

  • Google Trends 找蓝海赛道:独立开发者如何挖出没人做、但有人搜的项目
  • 明成祖 朱棣
  • Python爬取Amazon实战:Playwright+动态请求头+Session池方案
  • CNA BUSOFF 理解
  • ESP32新手避坑指南:用ESP-Rainmaker点灯Demo,搞定BLE配网和手机APP连接
  • RT-Thread Nano实战:用正点原子STM32F103驱动多个外设(LED、按键、串口)
  • 金融领域多模态RAG框架MultiFinRAG解析与应用
  • Claude Code in Cursor:代理式AI编程的可审查实践
  • 告别串口调试烦恼:手把手教你用vTESTstudio的CAPL函数搞定VT7001通道通信
  • 终极Windows右键菜单清理指南:用ContextMenuManager三分钟打造高效工作流
  • OnlyOffice保存失败根因:JWT签名与X-Frame-Options权限断点解析
  • 低空经济规模化落地前置刚需:产业赛道全景+低空安防技术体系深度解析
  • 禅道RCE漏洞原理与三阶修复实战指南
  • AI智能体GDPR合规实战:从可观测性到强制执行记录的架构设计
  • 2026 年 AI 开发,避坑选型完整攻略
  • DeepSeek LeetCode 2646. 最小化旅行的价格总和 C++实现
  • 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活动时间、活动入口、优惠活动详细解读