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

Kimi LeetCode 3910. 统计节点和为偶数的连通子图 Python3实现

这是 LeetCode 3910 的 Python3 实现,题目要求统计节点和为偶数的连通诱导子图数量。

思路

由于 n \le 13,可以枚举所有非空子集(最多 2^{13}-1 = 8191 个),对每个子集:
1. 计算节点值之和,若为奇数则跳过
2. 用 DFS/BFS 检查诱导子图是否连通

使用位掩码表示子集,高效判断连通性。

```python
class Solution:
def evenSumSubgraphs(self, nums: list[int], edges: list[list[int]]) -> int:
n = len(nums)
# 建图
g = [[] for _ in range(n)]
for u, v in edges:
g[u].append(v)
g[v].append(u)

m = (1 << n) - 1 # 全1掩码
ans = 0

# 枚举所有非空子集 sub (1 ~ 2^n - 1)
for sub in range(1, m + 1):
# 1. 计算子集节点值之和
s = 0
tmp = sub
while tmp:
i = (tmp & -tmp).bit_length() - 1 # 最低位的1的索引
s += nums[i]
tmp &= tmp - 1 # 去掉最低位的1

# 和为奇数,跳过
if s & 1:
continue

# 2. 检查诱导子图是否连通
# vis: 已访问标记。不在子集中的节点视为"已访问"
vis = m ^ sub

# 从子集中任意一个节点开始DFS
start = (sub & -sub).bit_length() - 1 # 最低位的1的索引

# DFS
stack = [start]
vis |= 1 << start
while stack:
u = stack.pop()
for v in g[u]:
if not (vis >> v) & 1: # v未访问
vis |= 1 << v
stack.append(v)

# 如果所有位都是1,说明子集内所有节点连通
if vis == m:
ans += 1

return ans
```

更简洁的版本(使用内置函数)

```python
class Solution:
def evenSumSubgraphs(self, nums: list[int], edges: list[list[int]]) -> int:
n = len(nums)
g = [[] for _ in range(n)]
for u, v in edges:
g[u].append(v)
g[v].append(u)

m = (1 << n) - 1
ans = 0

for sub in range(1, m + 1):
# 计算和
s = sum(nums[i] for i in range(n) if sub >> i & 1)
if s & 1:
continue

# BFS检查连通性
start = (sub & -sub).bit_length() - 1
vis = m ^ sub
q = [start]
vis |= 1 << start

for u in q:
for v in g[u]:
if not (vis >> v) & 1:
vis |= 1 << v
q.append(v)

if vis == m:
ans += 1

return ans
```

关键点

要点 说明
`m = (1 << n) - 1` n位全1掩码
`sub` 枚举 从 1 到 2^n-1
`s & 1` 快速判断奇偶
`vis = m ^ sub` 不在子集中的节点设为已访问
`(sub & -sub).bit_length() - 1` 取最低位1的索引作为起点
`vis == m` 所有节点被访问到,说明连通

复杂度

- 时间复杂度:O(2^n \times (n + m))
- 空间复杂度:O(n + m)

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

相关文章:

  • 宇视出入口设备默认IP地址全解析与网络寻址实战指南
  • 【创新方案】绝区零一条龙全自动辅助工具:解放双手的智能托管引擎
  • 显卡驱动卸载不干净?Display Driver Uninstaller 保姆级清理指南,一次解决残留难题
  • Cat.1 DTU与Cat.4 DTU怎么选?带宽够用吗?
  • 告别月费订阅:Sunshine 自托管游戏串流,把家里的电脑变成随身的私人游戏库
  • 深圳处置闲置黄金实地探店,理清报价差别学会理性选择回收渠道 - 日常前沿快讯
  • 从One-Hot到BERT:深入解析Embedding技术原理、演进与工程实践
  • 3步完成网易云NCM转MP3:ncmdump开源解密工具上手指南
  • 还在手动处理微信小店订单?这款铺货工具支持批量下单,多店铺管理省心省事 - 抖大侠
  • 网盘直链下载助手是什么?三步绕开官方客户端拿到百度网盘等8大网盘真实下载地址
  • tModLoader常见问题排查终极手册:一次把“装不上、进不去、玩不爽“彻底问清楚
  • 网盘下载慢到怀疑人生?三步装上这款网盘直链解析工具,让文件“嗖“地飞进电脑
  • 实习生视角:一套轻量化 IT 设备管理系统,如何把机房运维的“糊涂账“算清楚
  • 免费开源文档下载工具:kill-doc 让 30+ 平台文档一键下载
  • 44. 【Java】线程安全与同步:synchronized与Lock
  • 市面上做学工一体化平台的厂家不少,到底该怎么挑
  • 基于MiniCPM5-1B构建本地研究智能体:低成本实现工具调用与数据隐私
  • VMProtect逆向分析:从虚拟机原理到实战还原技术
  • 从收藏夹空转到本地整库:抖音视频批量下载的开源方案实测记录
  • 2026绵阳防水补漏全解析|雨季、回南天房屋渗漏实用指南 - 筑宅安
  • 2026年宁波能做智慧燃气安全监测管理系统的公司有哪些?
  • 猿人学 第一题 js混淆-源码乱码
  • 国产大模型与AI Agent比价工具:如何量化集成成本与动态计算TCO
  • Meta Muse Glimmer-30B部署实战:从Hugging Face到vLLM的高效推理指南
  • Python函数的定义调用参数和返回值
  • 【刚刚获悉】深圳全屋定制看哪些**认证? - 各行各业Ethan说
  • NCM文件解密3步走:免费开源的ncmdump,让下载的歌真正属于你
  • 互加科技拆解微盟星启GEO五阶优化第四环:监测,GEO闭环不可或缺的技术环节 - 天下观知
  • Sunshine游戏串流实战指南:把书房电脑变成全家人的游戏主机
  • 采购打炉机,如何寻找源头供应商?认准这三点,省钱避坑不踩雷 - 品牌品鉴馆