news 2026/5/15 21:57:49

Kimi LeetCode 2322.从树中删除边的最小分数 C语言实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 2322.从树中删除边的最小分数 C语言实现

这是 LeetCode 2322「从树中删除边的最小分数」的 C 语言实现。

核心思路

1. 建图:用邻接表存储树的结构
2. DFS 预处理:以 0 为根节点,计算每个节点的子树异或值 `subXor[]`,同时记录进入/离开时间 `in[]`/`out[]` 用于判断祖先关系
3. 枚举边对:树有 n-1 条边,每条边对应一个非根子树。枚举所有非根节点对 (u, v) 代表删除两条边,根据祖先关系分三种情况计算三个连通块的异或值:
- u 是 v 的祖先:三块为 `subXor[v]`、`subXor[u]^subXor[v]`、`totalXor^subXor[u]`
- v 是 u 的祖先:对称情况
- 互不为祖先:三块为 `subXor[u]`、`subXor[v]`、`totalXor^subXor[u]^subXor[v]`
4. 取所有方案中 `max - min` 的最小值

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

// LeetCode 2322. 从树中删除边的最小分数
// C 语言实现

typedef struct {
int *data;
int size;
int cap;
} Vec;

static void vec_init(Vec *v) {
v->data = NULL;
v->size = 0;
v->cap = 0;
}

static void vec_push(Vec *v, int x) {
if (v->size == v->cap) {
v->cap = v->cap ? v->cap * 2 : 4;
v->data = realloc(v->data, sizeof(int) * v->cap);
}
v->data[v->size++] = x;
}

static void vec_free(Vec *v) {
free(v->data);
v->data = NULL;
v->size = v->cap = 0;
}

// 全局变量
static Vec *g; // 邻接表
static int *in, *out; // DFS 时间戳
static int *subXor; // 子树异或值
static int timer;
static int totalXor;

static void dfs(int u, int p, const int *nums) {
in[u] = timer++;
subXor[u] = nums[u];
for (int i = 0; i < g[u].size; i++) {
int v = g[u].data[i];
if (v == p) continue;
dfs(v, u, nums);
subXor[u] ^= subXor[v];
}
out[u] = timer - 1;
}

// 判断 u 是否是 v 的祖先(包含自身)
static int isAncestor(int u, int v) {
return in[u] <= in[v] && out[u] >= out[v];
}

// 求三个数的最大值
static int max3(int a, int b, int c) {
int m = a > b ? a : b;
return m > c ? m : c;
}

// 求三个数的最小值
static int min3(int a, int b, int c) {
int m = a < b ? a : b;
return m < c ? m : c;
}

int minimumScore(int *nums, int numsSize, int **edges, int edgesSize, int *edgesColSize) {
int n = numsSize;

// 建图
g = malloc(sizeof(Vec) * n);
for (int i = 0; i < n; i++) vec_init(&g[i]);
for (int i = 0; i < edgesSize; i++) {
int a = edges[i][0], b = edges[i][1];
vec_push(&g[a], b);
vec_push(&g[b], a);
}

// 计算整棵树的总异或值
totalXor = 0;
for (int i = 0; i < n; i++) totalXor ^= nums[i];

// 初始化数组
in = malloc(sizeof(int) * n);
out = malloc(sizeof(int) * n);
subXor = malloc(sizeof(int) * n);
timer = 0;

// 以 0 为根进行 DFS
dfs(0, -1, nums);

int ans = INT_MAX;

// 枚举所有非根节点对(每个非根节点代表其父边)
// 节点 0 是根,没有父边,所以从 1 开始
for (int u = 1; u < n; u++) {
for (int v = 1; v < n; v++) {
if (u == v) continue;

int xor1, xor2, xor3;

if (isAncestor(u, v)) {
// u 是 v 的祖先
xor1 = subXor[v]; // v 的子树
xor2 = subXor[u] ^ subXor[v]; // u 的子树去掉 v 的子树
xor3 = totalXor ^ subXor[u]; // 剩余部分
} else if (isAncestor(v, u)) {
// v 是 u 的祖先
xor1 = subXor[u]; // u 的子树
xor2 = subXor[v] ^ subXor[u]; // v 的子树去掉 u 的子树
xor3 = totalXor ^ subXor[v]; // 剩余部分
} else {
// 互不为祖先
xor1 = subXor[u]; // u 的子树
xor2 = subXor[v]; // v 的子树
xor3 = totalXor ^ xor1 ^ xor2; // 剩余部分
}

int mx = max3(xor1, xor2, xor3);
int mn = min3(xor1, xor2, xor3);
int score = mx - mn;
if (score < ans) ans = score;
}
}

// 释放内存
for (int i = 0; i < n; i++) vec_free(&g[i]);
free(g);
free(in);
free(out);
free(subXor);

return ans;
}
```

复杂度分析

- 时间复杂度:O(n^2),DFS 为 O(n),枚举节点对为 O(n^2)
- 空间复杂度:O(n),邻接表和时间戳数组

关键说明

1. 以 0 为根:树是无向的,但我们需要一个根来确定父子关系和子树范围。选择 0 作为根节点,那么每个非根节点 `u` 到其父节点的边就是一条可被删除的边,`subXor[u]` 就是删除该边后 `u` 所在连通块的异或值。
2. 祖先判断:通过 DFS 序 `in/out` 可以在 O(1) 时间内判断两棵子树的包含关系,这是正确分类三种情况的基础。

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

Agent从“能用“到“管好“,中间差了什么?

从“玩具”到“工具”的跨越困境 许多企业在初期尝试引入 Agent 时&#xff0c;往往采取“单点突破”的策略——由个别极客员工或小型团队基于开源框架或云 API 快速搭建原型。这种模式在 POC&#xff08;概念验证&#xff09;阶段行之有效&#xff0c;但当企业试图将 Agent 规…

作者头像 李华
网站建设 2026/5/15 21:53:39

ClawPanel:Go+Vue3轻量级Docker管理面板部署与安全实践

1. 项目概述与核心价值 最近在折腾一个个人项目&#xff0c;需要一套轻量级的Web管理面板来部署和监控几个服务。说实话&#xff0c;市面上现成的面板要么太重&#xff08;功能繁杂、资源占用高&#xff09;&#xff0c;要么太“黑盒”&#xff08;配置不透明、扩展性差&#x…

作者头像 李华
网站建设 2026/5/15 21:53:25

氢燃料电池汽车空气供应系统建模与控制策略研究

氢燃料电池汽车空气供应系统建模与控制策略研究 摘要 氢燃料电池汽车作为实现碳中和目标的重要技术路径,其空气供应系统的动态响应直接影响电堆性能和系统效率。本文围绕质子交换膜燃料电池空气供应系统的建模与控制策略展开系统研究。首先分析了空气供应系统的物理构成与工…

作者头像 李华
网站建设 2026/5/15 21:52:10

5分钟搞定Mac通过Android手机USB共享上网:HoRNDIS驱动完整指南

5分钟搞定Mac通过Android手机USB共享上网&#xff1a;HoRNDIS驱动完整指南 【免费下载链接】HoRNDIS Android USB tethering driver for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/ho/HoRNDIS 还在为MacBook在户外找不到Wi-Fi而烦恼吗&#xff1f;想让你的And…

作者头像 李华
网站建设 2026/5/15 21:51:04

小白程序员如何低成本转行大模型?收藏这份进阶指南!

小白程序员如何低成本转行大模型&#xff1f;收藏这份进阶指南&#xff01; 本文针对不同背景的工程师如何转向算法/大模型领域给出建议&#xff1a;在校生应尽早按算法岗标准学习&#xff0c;利用AI提升效率&#xff1b;应届生建议先就业再补课&#xff0c;模糊算法与开发的界…

作者头像 李华