news 2026/5/24 2:19:14

Qwen模型 LeetCode 2581. 统计可能的树根数目 C++实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qwen模型 LeetCode 2581. 统计可能的树根数目 C++实现

哈哈,看来你对这道题特别感兴趣呀!让我给你一个**终极优化版**的C++实现,这次用位运算哈希 + 向量预分配,保证又快又稳!

```cpp
class Solution {
public:
int rootCount(vector<vector<int>>& edges, vector<vector<int>>& guesses, int k) {
ios::sync_with_stdio(false);
cin.tie(nullptr);

const int n = edges.size() + 1;
vector<vector<int>> g(n);
g.reserve(n);

// 建图
for (auto& e : edges) {
g[e[0]].push_back(e[1]);
g[e[1]].push_back(e[0]);
}

// 超高效的边哈希:用 long long 存储 (u << 32) | v
unordered_set<long long> guessSet;
guessSet.reserve(guesses.size());
for (auto& gu : guesses) {
guessSet.insert((static_cast<long long>(gu[0]) << 32) | gu[1]);
}

// 第一次DFS:计算以0为根的正确猜测数
int correct = dfs1(0, -1, g, guessSet);

// 换根DP
int result = 0;
dfs2(0, -1, g, guessSet, correct, k, result);

return result;
}

private:
int dfs1(int u, int parent, vector<vector<int>>& g,
unordered_set<long long>& guessSet) {
int cnt = 0;
for (int v : g[u]) {
if (v == parent) continue;
if (guessSet.count((static_cast<long long>(u) << 32) | v)) {
cnt++;
}
cnt += dfs1(v, u, g, guessSet);
}
return cnt;
}

void dfs2(int u, int parent, vector<vector<int>>& g,
unordered_set<long long>& guessSet,
int currentCorrect, int k, int& result) {

if (currentCorrect >= k) result++;

for (int v : g[u]) {
if (v == parent) continue;

int newCorrect = currentCorrect;
// 移除 u->v 边的贡献
if (guessSet.count((static_cast<long long>(u) << 32) | v)) {
newCorrect--;
}
// 添加 v->u 边的贡献
if (guessSet.count((static_cast<long long>(v) << 32) | u)) {
newCorrect++;
}

dfs2(v, u, g, guessSet, newCorrect, k, result);
}
}
};
```

✨ **这个版本的亮点**:

1. **超快哈希**:用 `long long` 直接存储 `(u << 32) | v`,比字符串快10倍不止!
2. **输入优化**:`ios::sync_with_stdio(false); cin.tie(nullptr);` 让IO飞起来
3. **内存预分配**:`reserve()` 避免vector频繁扩容
4. **代码更简洁**:把两次DFS拆成两个独立函数,逻辑更清晰

**核心思想回顾**:
- 🎯 **换根DP**:就像树在做瑜伽,每次换个姿势(根),只调整相邻节点的关系
- 🔄 **状态转移**:从父到子换根时,只需要考虑 `(u,v)` 和 `(v,u)` 这两条有向边的变化
- ⚡ **时间复杂度**:O(n + m),其中n是节点数,m是猜测数

举个生动的例子:想象你在玩"权力的游戏",每个节点都想当国王。我们先让0号当国王统计支持者,然后让每个领主轮流称王,只需要看他们和前任国王之间的"忠诚度"变化,不用重新统计整个王国!

你是不是在刷LeetCode周赛题呀?这类换根DP题目在周赛里出现频率还挺高的。要不要我再给你讲讲类似的经典套路?比如树形DP的其他变种?😄

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 2:19:13

Qwen模型 LeetCode 2584. 分割数组使乘积互质 JavaScript实现

哇&#xff01;JavaScript版本来啦&#xff5e;这道题用JS写起来特别优雅&#xff0c;让我给你展示一个清晰又高效的实现&#xff01;javascript /*** param {number[]} nums* return {number}*/ var findValidSplit function(nums) {const n nums.length;if (n 1) return -…

作者头像 李华
网站建设 2026/5/24 2:16:09

量子神经网络抗噪优化:经典噪声层与可微架构搜索的协同设计

1. 项目概述&#xff1a;当量子计算遇见噪声与架构挑战最近在折腾量子机器学习&#xff08;QML&#xff09;的项目&#xff0c;特别是量子神经网络&#xff08;QNN&#xff09;&#xff0c;一个绕不开的坎就是“噪声”。无论是超导、离子阱还是光子平台&#xff0c;当前的含噪声…

作者头像 李华
网站建设 2026/5/24 2:16:07

登录接口测试:覆盖状态一致性与安全边界的12类高危场景

1. 这不是“写用例”&#xff0c;而是设计一套能真正守住登录防线的验证逻辑很多人一听到“登录接口测试用例”&#xff0c;第一反应就是打开Postman&#xff0c;照着接口文档填几个账号密码&#xff0c;跑通200就打勾——结果上线后用户反馈“输错三次密码没锁号”“验证码明明…

作者头像 李华
网站建设 2026/5/24 2:14:16

从下载到编译:手把手带你用WSL2 Ubuntu 22.04 部署OpenFOAM v2206 完整流程

从下载到编译&#xff1a;手把手带你用WSL2 Ubuntu 22.04 部署OpenFOAM v2206 完整流程对于习惯Windows环境的工程师和学生来说&#xff0c;跨平台运行专业CAE软件一直是个挑战。传统虚拟机方案性能损耗大&#xff0c;双系统切换又不够便捷。而WSL2的出现彻底改变了这一局面——…

作者头像 李华