2026-07-19:增量偶权环查询。用go语言,有一个包含 n 个节点的无向图,节点编号从 0 到 n-1,初始时图中不存在任何边。现在给定一个边序列 edges,其中每个元素都表示一条边,包含两个
2026-07-19增量偶权环查询。用go语言有一个包含 n 个节点的无向图节点编号从 0 到 n-1初始时图中不存在任何边。现在给定一个边序列 edges其中每个元素都表示一条边包含两个端点和一个权重权重的取值只能是 0 或 1。你需要按照这个序列的顺序逐条处理边对于当前这条边判断如果将其加入当前图中是否会导致出现某个环的边权重之和为奇数。只有当所有环的边权和都是偶数时才真正把这条边加入图中否则就忽略它。最终统计并返回按照此规则成功添加到图中的边的总数。3 n 50000。1 edges.length 50000。edges[i] [ui, vi, wi]。0 ui vi n。所有边都是唯一的。wi 0 或 wi 1。输入 n 3, edges [[0,1,1],[1,2,1],[0,2,1]]。输出 2。解释[0, 1, 1]添加节点 0 和节点 1 之间的边权重为 1。[1, 2, 1]添加节点 1 和节点 2 之间的边权重为 1。[0, 2, 1]节点 0 和节点 2 之间的边图中的虚线不被添加因为环 0 - 1 - 2 - 0 的边权和为 1 1 1 3奇数。题目来自力扣3887。大体步骤如下步骤 1问题转化与数据结构初始化转化判定条件边权为 0 或 1因此一个环的边权和为偶数 (\Longleftrightarrow) 环上所有边权的异或和为 0。如果图中所有环的异或和都为 0那么图中任意两个节点之间的任意路径的异或和都是唯一确定的与路径无关。这个性质正是我们维护的目标。设计并查集使用一个带权并查集包含两个长度为 (n) 的数组fa[x]节点 (x) 的父节点初始时每个节点的父节点都是自己。dis[x]从节点 (x) 到其父节点fa[x]的路径上的边权异或和。初始时所有dis[x] 0。当并查集中一棵树被维护好时对任意节点 (x)我们可以通过不断向上查找根同时累积dis值得到 (x) 到整棵树根节点的异或距离。步骤 2定义带路径压缩的find操作递归查找根节点对于节点 (x)如果fa[x] ! x说明它不是根先递归地找到fa[x]的根节点root。更新异或距离路径压缩在递归返回时已知fa[x]到root的异或距离已经更新好即dis[fa[x]]表示fa[x]到root的异或和。我们希望把 (x) 直接连到root上那么新的dis[x]应该是 (x) 到旧父节点fa[x]的异或和再异或上fa[x]到root的异或和。因此执行dis[x] dis[x] ^ dis[fa[x]]然后将fa[x]设为root。返回根节点返回root。这样经过find(x)后fa[x]直接指向根且dis[x]成为 (x) 到根的异或距离。步骤 3定义merge操作以处理一条边输入一条边(from, to, value)其中value是边权0 或 1。我们要判断这条边能否加入。查找两端所在根及异或距离令x find(from)y find(to)。此时dis[from]是from到根x的异或距离。dis[to]是to到根y的异或距离。情况 A两端已在同一连通块x y此时from与to之间已存在一条路径该路径的异或和为dis[from] ^ dis[to]。如果加入当前边会形成一个新环环的异或和为(dis[from] ^ dis[to]) ^ value要使得环的边权和为偶数必须满足异或和为 0即dis[from] ^ dis[to] value若相等说明加入后不会产生奇权环接受该边返回true但图结构不变因为已经在同一连通块中无需再连边。若不等说明会产生奇权环拒绝该边返回false不修改图。情况 B两端不在同一连通块x ! y此时加入这条边不会形成任何环因为原本不连通所以一定满足“所有环边权和为偶数”的条件我们接受该边并需要将两棵树合并。合并时我们要为新的连接关系设置dis值使得从from到to的异或距离等于value。设我们要将根x接到根y上即设置fa[x] y。那么需要确定dis[x]从x到y的边权异或值使得路径from → x → y → to的总异或和等于value。这个路径的异或和为dis[from] ^ dis[x] ^ dis[to]。令其等于valuedis[from] ^ dis[x] ^ dis[to] value解得dis[x] value ^ dis[from] ^ dis[to]。执行赋值完成合并返回true。步骤 4主流程依次处理所有边初始化并查集ans 0。遍历边列表edges对每条边调用merge(from, to, weight)。如果merge返回true则ans加一。遍历结束后ans即为成功添加到图中的边的总数。步骤 5示例验证n3, edges[[0,1,1],[1,2,1],[0,2,1]]初始节点 0,1,2 各自独立。边 [0,1,1]find(0)0, find(1)1不同根合并。dis[0] 1 ^ 0 ^ 0 1fa[0]1。加入成功ans1。边 [1,2,1]find(1)1, find(2)2不同根合并。dis[1] 1 ^ 0 ^ 0 1fa[1]2。此时dis[0]经过find压缩后会是dis[0]^dis[1]1^10即 0 到根 2 的异或距离为 0。加入成功ans2。边 [0,2,1]find(0)2, dis[0]0find(2)2, dis[2]0。同根检查dis[0] ^ dis[2] 0是否等于 10 ! 1产生奇权环拒绝。最终ans2。复杂度分析时间复杂度并查集使用了路径压缩find和merge操作的均摊时间复杂度几乎是常数级别精确地说是反阿克曼函数 (O(\alpha(n)))。主循环处理 (m) 条边每条边执行常数次find和简单运算因此总时间复杂度为 (O(m \cdot \alpha(n)))。在数据范围内(n, m \leq 50000)这非常高效。额外空间复杂度除了输入和少量变量外我们维护了两个大小为 (n) 的数组fa和dis所以额外空间复杂度为 (O(n))。Go完整代码如下packagemainimport(fmt)typeunionFindstruct{fa[]int// fa[x] 是 x 的代表元dis[]int// dis[x] 从 x 到 fa[x] 的路径异或和}funcnewUnionFind(nint)unionFind{fa:make([]int,n)dis:make([]int,n)fori:rangefa{fa[i]i}returnunionFind{fa,dis}}func(u unionFind)find(xint)int{ifu.fa[x]!x{root:u.find(u.fa[x])u.dis[x]^u.dis[u.fa[x]]u.fa[x]root}returnu.fa[x]}func(u unionFind)merge(from,to,valueint)bool{x,y:u.find(from),u.find(to)ifxy{returnu.dis[from]^u.dis[to]value}u.dis[x]value^u.dis[to]^u.dis[from]u.fa[x]yreturntrue}funcnumberOfEdgesAdded(nint,edges[][]int)(ansint){uf:newUnionFind(n)for_,e:rangeedges{ifuf.merge(e[0],e[1],e[2]){ans}}return}funcmain(){n:3edges:[][]int{{0,1,1},{1,2,1},{0,2,1}}result:numberOfEdgesAdded(n,edges)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-classUnionFind:def__init__(self,n:int):self.falist(range(n))# 父节点代表元self.dis[0]*n# 到父节点的路径异或和deffind(self,x:int)-int:ifself.fa[x]!x:rootself.find(self.fa[x])self.dis[x]^self.dis[self.fa[x]]self.fa[x]rootreturnself.fa[x]defmerge(self,u:int,v:int,w:int)-bool: 尝试加入权重为 w 的边 (u, v)。 若不会产生奇数环即异或条件满足则真正合并并返回 True 否则返回 False。 x,yself.find(u),self.find(v)ifxy:# 已连通检查当前路径异或和是否等于 wreturnself.dis[u]^self.dis[v]w# 未连通合并两个集合self.dis[x]w^self.dis[u]^self.dis[v]self.fa[x]yreturnTruedefnumberOfEdgesAdded(n:int,edges:list[list[int]])-int:ufUnionFind(n)ans0foru,v,winedges:ifuf.merge(u,v,w):ans1returnansif__name____main__:n3edges[[0,1,1],[1,2,1],[0,2,1]]print(numberOfEdgesAdded(n,edges))C完整代码如下#includeiostream#includevectorusingnamespacestd;classUnionFind{public:vectorintfa;// 父节点代表元vectorintdis;// 到父节点的路径异或和UnionFind(intn):fa(n),dis(n,0){for(inti0;in;i){fa[i]i;}}intfind(intx){if(fa[x]!x){introotfind(fa[x]);dis[x]^dis[fa[x]];fa[x]root;}returnfa[x];}// 尝试加入权值为 w 的边 (u, v)// 返回 true 表示加入后无矛盾false 表示会产生奇数环矛盾boolmerge(intu,intv,intw){intxfind(u),yfind(v);if(xy){// 已连通检查当前路径异或和是否等于 wreturn(dis[u]^dis[v])w;}// 未连通合并两个集合fa[x]y;dis[x]w^dis[u]^dis[v];returntrue;}};intnumberOfEdgesAdded(intn,constvectorvectorintedges){UnionFinduf(n);intans0;for(constautoe:edges){if(uf.merge(e[0],e[1],e[2])){ans;}}returnans;}intmain(){intn3;vectorvectorintedges{{0,1,1},{1,2,1},{0,2,1}};intresultnumberOfEdgesAdded(n,edges);coutresultendl;return0;}

相关新闻

AI数字人嘴型不同步、口型崩坏、延迟卡顿——硬件适配清单与GPU资源调度公式全公开

AI数字人嘴型不同步、口型崩坏、延迟卡顿——硬件适配清单与GPU资源调度公式全公开

更多请点击: https://codechina.net 第一章:AI数字人直播带货的核心痛点与技术本质 AI数字人直播带货并非简单地将真人主播替换成3D模型,其背后是多模态感知、实时驱动、语义理解与商业逻辑深度耦合的系统工程。当前行业普遍存在“形似神不似…

2026/7/19 13:24:33阅读更多 →
AI数字人不是“换脸”!深度拆解12层技术栈:TTS/LLM驱动/VISUAL RENDER/实时推流/多模态对齐全链路图谱

AI数字人不是“换脸”!深度拆解12层技术栈:TTS/LLM驱动/VISUAL RENDER/实时推流/多模态对齐全链路图谱

更多请点击: https://intelliparadigm.com 第一章:AI数字人不是“换脸”!——虚拟主播的本质认知与技术边界 AI数字人常被误读为“高级换脸工具”,实则其技术内核远超图像替换范畴。它融合语音合成(TTS)、…

2026/7/19 13:24:33阅读更多 →
RAG知识库预处理全流程拆解:网页爬取+语义分块实战教程

RAG知识库预处理全流程拆解:网页爬取+语义分块实战教程

文章目录一、做RAG最头疼的不是大模型,是五花八门的原始数据二、Loader:搞定所有异构文件的万能适配器2.1 社区生态有多夸张?180加载器全覆盖三、网页爬虫专用Loader:Cheerio底层逻辑拆解3.1 三步搞定网页正文提取3.2 极简可运行代…

2026/7/19 13:22:33阅读更多 →
UE4SS实战指南:从原理到脚本编写,掌握虚幻4游戏Mod开发

UE4SS实战指南:从原理到脚本编写,掌握虚幻4游戏Mod开发

1. 项目概述:从“开挂”到“创造”的思维转变 最近在游戏社区里,UE4SS这个工具的热度居高不下。无论是想给《幻兽帕鲁》增加点便利功能,还是想深入修改某个单机游戏的内部机制,UE4SS都成了绕不开的名字。但很多新手一上来就懵了&a…

2026/7/19 20:38:25阅读更多 →
CRM智能化失败根源:数据仓库先行才是AI落地的物理前提

CRM智能化失败根源:数据仓库先行才是AI落地的物理前提

1. 这不是AI的问题,是数据地基没打牢“Why AI in CRM Fails Without a Warehouse-First Architecture”——这个标题一出来,我就在客户现场的白板上画了个三层结构:最上面是CRM界面里那个闪着光的“智能推荐客户”按钮,中间是后台…

2026/7/19 20:38:25阅读更多 →
libGDX项目Java到Kotlin迁移实战:ktx扩展库应用与增量重构指南

libGDX项目Java到Kotlin迁移实战:ktx扩展库应用与增量重构指南

1. 项目概述:为什么libGDX开发者需要关注Kotlin与ktx如果你是一个使用libGDX框架的Java开发者,最近可能被两件事刷屏:一是Kotlin这门语言越来越火,二是libGDX官方推出了一个叫“ktx”的扩展库。你可能会想,我的Java项目…

2026/7/19 20:38:25阅读更多 →
LangGraph多智能体架构选型:Network与Supervisor实战指南

LangGraph多智能体架构选型:Network与Supervisor实战指南

1. 项目概述:当AI不再单打独斗,而是组成一支能开会、能分工、能复盘的“数字团队”你有没有试过让一个大模型同时干五件事?查资料、写报告、画图表、校对语法、再翻译成英文——结果它要么在中间突然跑题,要么把数据张冠李戴&…

2026/7/19 20:38:25阅读更多 →
五次多项式轨迹设计:面向工程师的视觉化运动规划方法

五次多项式轨迹设计:面向工程师的视觉化运动规划方法

1. 项目概述:这不是一个“画图软件”,而是一套面向非程序员的数学直觉构建系统“Designing Quintic’s — A Visually Intuitive Approach!” 这个标题里藏着三个关键信号:Quintic(五次多项式)、Designing(…

2026/7/19 20:38:25阅读更多 →
GPMC预取与写回引擎:提升嵌入式NAND存储性能的核心技术

GPMC预取与写回引擎:提升嵌入式NAND存储性能的核心技术

1. 项目概述:为什么我们需要GPMC的预取与写回引擎?在嵌入式系统开发里,尤其是那些需要和NAND闪存这类“慢性子”存储设备打交道的场景,性能瓶颈往往不在处理器本身,而在于“等数据”。想象一下,你让一个百米…

2026/7/19 20:36:25阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →