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

Kimi LeetCode 3547. 图中边值的最大和 Rust实现

以下是 LeetCode 3547. 图中边值的最大和 的 Rust 实现。

解题思路

由于每个节点最多与其他两个节点相连,整个图由若干链和环组成。

1. 连通分量分类:用 DFS 找出所有连通分量。若分量内所有节点度数均为 2,则为环;否则为链(孤立点不贡献边权,忽略)。
2. 处理顺序:先处理环(每个节点有两条边,大数在环中能产生更多乘积),再处理链(按长度降序,长链优先拿大数)。
3. 填数策略:将剩余的最大数放在连通分量中间,次大数交替向两边扩展,使得大数尽量相邻(双端队列模拟)。

时间复杂度 O(n \log n),空间复杂度 O(n)。

---

Rust 代码

```rust
use std::collections::VecDeque;

struct Solution;

impl Solution {
pub fn max_score(n: i32, edges: Vec<Vec<i32>>) -> i64 {
let n = n as usize;
let mut graph = vec![vec![]; n];
for edge in &edges {
let u = edge[0] as usize;
let v = edge[1] as usize;
graph[u].push(v);
graph[v].push(u);
}

let mut seen = vec![false; n];
let mut cycle_sizes = vec![];
let mut path_sizes = vec![];

// 遍历每个连通分量
for i in 0..n {
if seen[i] {
continue;
}

// DFS 收集连通分量
let mut component = vec![];
let mut stack = vec![i];
seen[i] = true;

while let Some(u) = stack.pop() {
component.push(u);
for &v in &graph[u] {
if !seen[v] {
seen[v] = true;
stack.push(v);
}
}
}

// 判断是否为环:所有节点度数均为 2
let is_cycle = component.iter().all(|&u| graph[u].len() == 2);
if is_cycle {
cycle_sizes.push(component.len());
} else if component.len() > 1 {
path_sizes.push(component.len());
}
// 孤立点(size == 1)不贡献边权,无需处理
}

let mut ans: i64 = 0;
let mut remaining = n as i64;

// 先处理环:从剩余的最大数中分配
for size in cycle_sizes {
let size = size as i64;
ans += Self::calc_score(remaining - size + 1, remaining, true);
remaining -= size;
}

// 链按长度从大到小排序,优先处理长链
path_sizes.sort_by(|a, b| b.cmp(a));
for size in path_sizes {
let size = size as i64;
ans += Self::calc_score(remaining - size + 1, remaining, false);
remaining -= size;
}

ans
}

/// 将 [left, right] 范围内的数填入一个连通分量,计算最大边权和。
///
/// 策略:双端队列模拟"中间放大数,向两边递减"的排列。
/// 初始放入两个 right,从 right-1 递减到 left,每次取出队首与当前值相乘,
/// 再将当前值放入队尾。
fn calc_score(left: i64, right: i64, is_cycle: bool) -> i64 {
let mut dq = VecDeque::new();
dq.push_back(right);
dq.push_back(right);
let mut score: i64 = 0;

for val in (left..right).rev() {
let window_val = dq.pop_front().unwrap();
score += window_val * val;
dq.push_back(val);
}

// 如果是环,首尾两个节点也相邻,额外加上首尾乘积
if is_cycle {
score += dq.front().unwrap() * dq.back().unwrap();
}

score
}
}
```

---

关键说明

要点 说明
连通分量分类 所有节点度数均为 2 → 环;否则为链(含孤立点)
处理顺序 环优先于链,因为环的每个节点都有两条边,大数在环中能产生更多乘积;链按长度降序,长链优先拿大数
`calc_score` 双端队列模拟最优排列。例如 `[7..11]` 填入 5 个节点的链,排列为 `8-10-11-9-7`,边权和最大
环额外处理 环首尾相连,所以 `dq.front() * dq.back()` 是最后一条边的贡献

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

相关文章:

  • 2026年轻编绳采购指引 重庆及西南地区靠谱厂商选择参考 - 热点品牌推荐
  • 阜阳本地找超白胚木纹砖 线下实体店地址及选购指南 - 热点品牌推荐
  • 亨得利官方名表服务中心|维修地址及售后热线权威信息通告(2026年7月最新) - 亨得利官方博客
  • 长沙百达翡丽回收价格查询与各大平台实测排行(2026年7月最新数据) - 天价名表回收平台
  • 2026年留学生求职服务行业测评报告:机构综合实力对比与选择避坑指南 - 互联网科技品牌测评
  • 从 LLM 到 Agentic SDLC:ChatGPT Pro、Plus 与 CODEX 如何重构软件开发生命周期
  • 宝珀回收价格查询与靠谱回收平台实测排行(2026年7月最新) - 宝珀官方售后服务中心
  • 2026浙江省企业必看:支持语义分析的GEO优化工具核心价值与选型逻辑 - 企智芯
  • 抗氧化精华液哪家效果好:蜜妙诗延缓暗沉 - MXyuyu
  • Kimi LeetCode 3547. 图中边值的最大和 C++实现
  • 吉林短剧平台资质代办机构排行:合规与效率双维度评测 - 起跑123
  • 深圳百达翡丽回收价格查询与各大回收平台实测排行(2026年7月最新) - 诚收名表回收平台
  • 2026年企业短视频矩阵系统服务商怎么选更靠谱 - 热点品牌推荐
  • 2026 年新发布:台江值得关注的润滑油工厂深度剖析,加了它居然更费油?修车工秘辛曝光 - 行业甄选官
  • 2026年7月浙江智能立体库厂家专业度实测评测 - 起跑123
  • 国内旋转轴封生产厂家实力排行及核心能力对比 - 起跑123
  • 亲身到店探访广州芝柏官方售后服务中心|服务电话与网点地址(2026年7月最新) - 亨得利官方服务中心
  • 2026年7月最新贵阳格拉苏蒂官方售后维修服务网点地址与客服电话 - 亨得利钟表维修中心
  • VS Code C# Dev Kit 1.0 配置指南:5个必装插件与 .NET 8 项目创建实战
  • Kimi LeetCode 3548. 等和矩阵分割 II Java实现
  • 上海黄埔区万国+积家+肖邦手表回收TOP3门店测评,哪家报价划算一目了然 - 沪上贵金属口碑推荐官
  • 2026小众垂直聊天实时翻译软件行业测评报告:6大品牌横向对比,爱翻译99.0分登顶跨境外贸首选 - 互联网科技品牌测评
  • 广州宝珀回收价格查询和各大回收平台实测排行(2026年7月最新数据) - 嘉价奢侈品回收平台
  • 【仅限本周开放】AI Agent记忆系统架构图谱(含12种存储策略选型决策树+成本-精度权衡模型)
  • 从加盟商实测视角看:炒酸奶加盟靠谱品牌怎么选 - 起跑123
  • 卡地亚官方售后服务中心热线及维修地址实地考察报告+多信源验证(2026年7月更新) - 卡地亚服务中心
  • 亲身到店探访合肥亨得利官方名表服务中心|全新地址电话(2026年7月更新) - 亨得利官方
  • Git bundle 与 tar/zip 备份对比:2种方案性能与完整性实测
  • 2026年福建地区实惠的门窗密封胶门店怎么选 - 热点品牌推荐
  • GHelper完整指南:5步轻松掌控华硕笔记本性能,告别臃肿官方软件