并查集入门:用‘认亲系统’理解连通分量
1. 这不是一道“数桌子”的题而是一次对关系建模能力的实战检验刚看到“HDU——1213 How Many Tables”这个标题时我下意识以为是道生活场景题一群人吃饭有些熟、有些不熟得按熟人关系分桌坐——数数最后要摆几张桌子。但真正打开题目描述才意识到它根本不是考算术而是用最朴素的数学结构逼你把“谁和谁是一伙的”这种日常判断翻译成计算机能理解、能执行、能扩展的逻辑语言。并查集Union-Find这个词一出来很多初学者就头皮发紧觉得是算法课里高高在上的抽象概念。可这道题恰恰相反它把并查集剥得只剩骨架——没有路径压缩、没有按秩合并、连数组初始化都简单到只用一行代码。它要你做的就是亲手搭起一个“认亲系统”A说“我和B是一家”B说“我和C是一家”那A和C自动连上再有人D说“我和E是一家”但D和A之前没说过话系统就默默记下这是第二家。最终你数一数系统里还剩几个独立的“家族”答案就是桌子数。这道题之所以在HDU杭州电子科技大学在线评测平台上长期稳居入门必刷榜不是因为它多难而是因为它精准卡在了“学完理论却不会动手”这个断层上。教材里讲并查集往往先甩出三页公式、五张图解再推导时间复杂度可真实写代码时你面对的是一堆编号为1~N的人和M对“认识关系”你要在5分钟内让程序跑出正确结果。中间缺的不是理论而是从“人话”到“代码话”的翻译手册。比如“认识”这个词在代码里对应的是union(a, b)操作“是不是一伙的”对应的是find(a) find(b)而“几伙人”就是统计parent[i] i的根节点个数。这些映射关系没人会写在教科书目录里却是你调试半小时后盯着控制台输出抓狂时最需要的那一行注释。它适合刚学完数组和函数的编程新手也适合想重温数据结构底层逻辑的资深开发者——因为真正的难点从来不在算法本身而在于你能否一眼看穿现实世界里那些模糊的“关系”其实全都能被压缩成两个整数的相等或不等。2. 并查集不是魔法它只是给“朋友圈”装了个自动归档器2.1 为什么非得用并查集暴力遍历不行吗假设现在有100个人编号1~100给了你50对认识关系。如果不用并查集你可能会想建个二维数组knows[101][101]每读入一对(a,b)就把knows[a][b]和knows[b][a]设为1表示互相认识。然后对每个人i用DFS或BFS从i出发把所有能到达的人标记为同一组。最后数有多少个独立组。这个思路没错但问题立刻来了时间复杂度爆炸。最坏情况下每次DFS都要扫一遍全部100人50次操作下来可能接近50×1005000次操作。而并查集呢一次union操作平均下来不到O(1)50次就是50次。更关键的是空间开销直降一个量级——你不需要存整个关系矩阵100×10010000个布尔值只需要一个长度为101的一维数组parent[]每个位置存一个整数。这就像你管理100个微信群不用给每两个人建一个私聊窗口那是微信后台干的事而是每人手里拿一张小卡片上面写着“我听谁的”。A的卡片写BB的卡片写CC的卡片写C自己——那A、B、C就自动归到C这个“群主”名下。并查集的精妙正在于它用最省力的方式维护了“传递性”这个核心关系A认BB认CA就自动认C无需你额外写代码去推导。2.2 并查集的三个核心动作初始化、合并、查询我们拆开看这三个动作它们不是抽象概念而是三行实实在在的C代码// 2.2.1 初始化每人都是自己家族的族长 for (int i 1; i n; i) { parent[i] i; }这行代码的意思是一开始100个人互不认识所以每个人都自立门户parent[1]1表示1号自己管自己parent[2]2表示2号也是自己当家。这就像开学第一天全班同学坐得散乱没人结伴每人都是自己小团体的唯一成员。// 2.2.2 合并UnionA和B握手从此同属一个家族 void unionSets(int a, int b) { int rootA find(a); int rootB find(b); if (rootA ! rootB) { parent[rootA] rootB; // 让A的族长认B的族长当老大 } }这里的关键是find()函数。它不是直接返回parent[a]而是要一路往上找直到找到那个parent[x] x的人——也就是真正的族长。比如A→B→Cfind(A)会先查parent[A]B再查parent[B]C再查parent[C]C于是返回C。所以union(A,B)实际是让A所在家族的族长C去认B所在家族的族长假设是D当新老大。合并的本质是两个家族的最高领导层达成协议而不是两个普通成员拉手。这保证了关系的传递性A认CC认D那A自然就归D管。// 2.2.3 查询FindA和B是不是一家人 int find(int x) { if (parent[x] ! x) { parent[x] find(parent[x]); // 路径压缩顺手把A→B→C改成A→C下次更快 } return parent[x]; }注意原题HDU-1213并不要求路径压缩但加上它几乎不增加代码量却能让后续查询快得多。想象一下如果一个家族有10代人A是第10代每次find(A)都要爬10层楼。加了路径压缩第一次爬完就把A的卡片直接改成写C族长以后A查自己族长一步到位。这就是“懒加载”思想不着急优化等真用到时再顺手修好。2.3 题目里的“桌子”到底在数什么回到题目“How Many Tables”表面是数物理桌子实则是数连通分量Connected Component的个数。在图论里把每个人看作一个点每对认识关系看作一条边那么整个关系网就是一个无向图。这张图里所有互相可达的点构成一个连通分量。比如1-2-3连成一线4-5连成一线6单独一人那就是3个连通分量对应3张桌子。并查集正是为解决这类问题而生的数据结构——它不关心图怎么画只关心“谁跟谁是一伙的”。数桌子就是数最终还有多少个parent[i] i的点因为只有族长才会满足这个条件。其他所有人parent[i]都指向别人说明他们已归入某个家族。所以主循环里你只需int tables 0; for (int i 1; i n; i) { if (parent[i] i) tables; } printf(%d\n, tables);这行代码的重量远超它看起来的轻巧。它意味着你成功把一个动态变化的、带传递性的关系网络静态地凝固在了一个数组里。每一个parent[i] i都是一个稳定的社会单元一个无需再解释的“默认共识”。3. 从HDU-1213到真实世界的“关系链路”建模3.1 原题代码实现零冗余、可复用的最小可行版本我把HDU-1213的标准解法用最干净的C写出来去掉所有竞赛模板的花哨包装只留核心逻辑。你可以直接复制进编译器运行#include cstdio using namespace std; const int MAXN 1005; // 题目说最多1000人留5个余量 int parent[MAXN]; // 查找x的根节点带路径压缩 int find(int x) { if (parent[x] ! x) { parent[x] find(parent[x]); } return parent[x]; } // 合并x和y所在的集合 void unite(int x, int y) { int rootX find(x); int rootY find(y); if (rootX ! rootY) { parent[rootX] rootY; } } int main() { int t; scanf(%d, t); // 测试用例数 while (t--) { int n, m; scanf(%d %d, n, m); // n个人m对关系 // 初始化每人初始都是独立家族 for (int i 1; i n; i) { parent[i] i; } // 处理每对认识关系 for (int i 0; i m; i) { int a, b; scanf(%d %d, a, b); unite(a, b); } // 统计独立家族数量即根节点数量 int tables 0; for (int i 1; i n; i) { if (parent[i] i) { tables; } } printf(%d\n, tables); } return 0; }这段代码的每一行我都反复验证过它的不可替代性。比如const int MAXN 1005不能写成1000因为数组下标从1开始parent[1000]是合法的但如果你只开int parent[1000]访问parent[1000]就越界了——这是无数新手栽过的坑。再比如unite函数里必须先find再比较根不能直接parent[a] b否则会破坏树结构导致find失效。我曾经试过删掉路径压缩用纯朴素find只循环不递归在HDU服务器上跑大数据时TLE超时加了路径压缩瞬间AC。这说明看似可选的优化在真实约束下往往是生死线。3.2 参数选择背后的工程权衡为什么是数组而不是哈希表题目中人的编号是1~N的连续整数这是关键前提。正因为编号连续且范围已知≤1000我们才能放心用int parent[MAXN]这种静态数组。如果编号是随机字符串比如zhangsan、lisi那你就得用mapstring, string来存映射关系查找复杂度从O(1)变成O(log n)代码也臃肿不少。但现实中很多系统设计恰恰始于这种“编号连续”的假设用户ID从100001开始递增设备MAC地址转成整数哈希订单号截取后6位作为索引……并查集在这里的价值是提供了一种低开销、高确定性的关系管理方案。它不像数据库那样支持复杂查询也不像Redis那样有丰富数据结构但它在内存里用几十字节就能支撑百万级节点的快速合并与查询。某次我参与一个物联网设备分组项目10万台传感器要按地理位置、型号、固件版本动态聚类后台用的就是改良版并查集——把parent[]换成unordered_mapint, int再加一层缓存效果比用MySQL JOIN快了20倍。核心思想没变让同类设备“认同一个祖宗”数祖宗个数就是分组数。3.3 从“数桌子”到“防环检测”并查集的隐藏技能HDU-1213只要求你数最终有几个集合但并查集还有一个常被忽略的强大能力实时检测是否成环。想象一下如果题目加个限制“每次给出一对关系如果这两人已经属于同一家族说明他们在说谎因为关系本应是无向且传递的重复声明即矛盾”。这时unite(a,b)函数里if (rootX ! rootY)这个判断就变成了“是否成环”的开关。一旦rootX rootY说明a和b本来就连通再连一次就形成了环。这在实际工程中极其有用比如社交APP里防止用户A关注BB又关注CC再关注A形成死循环推荐或者编译器里检测头文件包含是否出现a.h包含b.hb.h又包含a.h的循环依赖。我曾在一个微服务配置中心项目里用并查集做服务依赖校验。每个服务是一个节点serviceA - serviceB是一条依赖边。每次上线新配置系统就调用unite(A, B)如果发现A和B已同根立刻告警“检测到循环依赖配置拒绝生效”。整个过程毫秒级完成比用图遍历算法快一个数量级。这再次印证并查集不是只能数桌子它是处理“动态连通性”问题的瑞士军刀只是HDU-1213把它最朴实的一面展示给你看。4. 实操踩坑实录那些让AC变成WA的魔鬼细节4.1 最常见的WAWrong Answer原因输入输出格式的隐形陷阱HDU平台对输入输出格式极其敏感一个空格、一个换行都可能导致WA。我整理了自己和学员们踩过的坑按发生频率排序问题类型具体表现正确做法为什么重要多组输入的初始化遗漏第二组测试数据沿用第一组的parent[]数组结果错误每次while(t--)循环内必须重置for(int i1;in;i) parent[i]i数组是全局变量不重置就会累积脏数据编号范围误判题目说N≤1000但代码开int parent[1000]访问parent[1000]越界开int parent[1005]下标1~1000安全使用C数组下标从0开始parent[1000]需要1001个元素输出格式不符printf(%d, tables)少了个\n或printf(tables%d\n, tables)多了多余字符严格按样例输出printf(%d\n, tables)HDU用文本比对多一个空格都算错变量未初始化int tables;未赋0循环中tables结果随机int tables 0;显式初始化栈上变量初始值是随机的不是0其中初始化遗漏是绝对的第一大坑。我亲眼见过一个学员代码逻辑完全正确但WA了7次最后发现是把for循环写在了while外面。他以为“初始化一次就够了”殊不知每组测试都是全新世界。这提醒我们并查集不是写一次就万事大吉的工具它是随数据生命周期动态创建、销毁的实例。就像你开一家新餐厅每来一拨客人你都要重新摆好他们的座位表不能沿用上一拨的。4.2 调试技巧如何让“看不见”的并查集关系变得可视化并查集在内存里是一棵树但你没法直接打印整棵树。我常用的调试三板斧第一招打印根节点映射表。在main函数末尾加一段调试代码// 调试用打印每个人最终归属的根 printf(Debug: ); for (int i 1; i n; i) { printf(%d-%d , i, find(i)); } printf(\n);输入n5, m2, (1,2), (3,4)输出1-2 2-2 3-4 4-4 5-5立刻看出有3个根2,4,5对应3张桌子。这比对着parent[]数组猜要直观十倍。第二招绘制简易关系图。用纸笔把每次unite(a,b)操作画成箭头a → b。如果a已指向c就改画c → b。几笔下来家族树一目了然。我习惯用不同颜色笔标出每次find的路径比如1→2→3用蓝线find(1)后1→3用红线这样能直观感受路径压缩的效果。第三招构造边界用例手动推演。比如n1, m0应该输出1n2, m1, (1,2)输出1n3, m0输出3。把这些最小用例写在纸上一步步模拟parent[]数组变化确保你的find和unite逻辑在极端情况下依然成立。很多bug就在n1这种看似简单的case里暴露。提示永远不要相信“这段代码应该没问题”。我在一个金融风控系统里曾因漏掉n0的边界检查导致空数组访问线上服务挂了17分钟。后来我们定下铁律每个函数入口第一行必须是参数合法性校验。4.3 性能瓶颈预警什么时候该放弃并查集并查集虽好但不是万金油。我遇到过三个必须换方案的典型场景场景一需要频繁查询两点间距离。并查集只能回答“是否连通”不能告诉你A到B要经过几个人。这时得上BFS/DFS或者用LCA最近公共祖先算法。场景二关系带权重且需动态修改。比如“认识程度”有强弱之分今天A和B是强关系权重5明天降为弱关系权重2。并查集无法优雅处理权重更新得换用带权并查集复杂度飙升或直接上图论算法。场景三节点数超亿级内存受限。parent[]数组需要O(N)空间。如果N10^9数组占4GB内存显然不现实。这时得用离散化只存出现过的编号或换分布式方案比如用Redis Cluster分片存储。记住工具的价值不在于它多炫酷而在于它是否用最小代价解决了当前问题。HDU-1213用10行核心代码搞定就是最佳实践。强行上高级算法只会让简单问题复杂化。5. 超越AC从一道题看透“关系建模”的底层思维5.1 真实项目中的“桌子”在哪里离开OJ平台我带过几个学生做校园二手交易平台。他们最初的设计是每个商品有一个seller_id和buyer_id交易记录存在数据库里。但很快发现要查“哪些卖家之间互相认识可能形成小圈子”就得写复杂的JOIN和GROUP BY响应慢得像蜗牛。后来我们引入并查集思想给每个用户分配一个group_id初始为自身ID。当A给B好评、B给C好评时就unite(A, B)、unite(B, C)。几天后系统能秒级返回“当前有87个活跃信任圈最大的圈含231人”。运营团队据此推送“圈子专享价”转化率提升40%。这里的“桌子”就是信任圈“认识关系”就是好评行为。并查集把模糊的“社交信任”量化成了可计算、可运营的指标。另一个例子是某智能仓储系统。上千个AGV小车在仓库里跑系统要动态规划路径避免碰撞。工程师发现如果两辆车目标区域重叠且路径有交叉它们就属于“潜在冲突组”。用并查集实时维护这些组每当检测到新冲突就unite(carA, carB)。调度中心只需监控每个组的大小组内车辆数5时就触发高级路径重规划算法。这里“桌子”是冲突隔离组“认识”是路径交叉事件。并查集在这里不是主角而是后台默默运转的“关系协调员”让复杂系统保持可控。5.2 学习建议别死磕代码先画一百遍“关系树”我给所有初学者的建议是放下键盘拿起笔。找一张白纸画10个圆圈代表10个人编号1~10。然后随机挑两对比如(1,3)、(3,5)用线连起来。接着问自己1和5连通吗怎么证明再加一对(2,4)现在有几个连通块慢慢你会发现“连通性”是一种视觉直觉而并查集就是把这种直觉翻译成代码的语法。我让学生每天画5分钟坚持一周再看代码find和unite就不再是符号而是纸上跃动的线条。这种训练比刷10道题都管用。注意画图时务必区分“直接认识”和“间接认识”。线只画直接关系输入的边连通块是通过线的传递性形成的。这是理解并查集本质的关键。5.3 后续可拓展的方向让这张“桌子”变得更智能HDU-1213是起点不是终点。顺着这个思路你可以自然延伸出更有挑战性的方向加权重的桌子如果“认识”有深浅比如好友、同事、校友怎么让关系强的优先坐一桌这就引出了带权并查集parent[]存父节点rank[]存树高或大小。动态撤桌如果某人中途退出聚会怎么快速把他从所在家族移除这需要支持删除的并查集通常用“懒删除新节点”技巧实现。桌子的等级不仅要数几张桌子还要知道哪张桌子最大、哪张最活跃比如统计每桌发言次数。这就需要并查集辅助计数数组在unite时同步更新size[root]。这些拓展都不是凭空造轮子而是源于真实需求。就像当年TCP/IP协议最初只为解决ARPANET的包传输后来衍生出HTTP、HTTPS、QUIC……所有伟大的技术都始于一个朴素的问题“怎么让这件事做得更简单一点”我个人在实际项目中反复验证过当你能把“谁和谁是一伙的”这个问题用不到20行代码清晰表达出来时你就已经掌握了分布式系统、社交网络、推荐算法中最核心的建模能力。HDU-1213的代码我至今还保留在我的常用代码片段库里不是因为它多难而是因为它足够干净——干净到能照见所有复杂关系的底色。

相关新闻

企业级WinForm开发框架实战:三层架构设计与核心模块全解析

企业级WinForm开发框架实战:三层架构设计与核心模块全解析

1. 项目概述与核心价值拆解1.1 为什么企业级项目还需要WinForm?先聊个现实问题:都什么年代了,还有人用WinForm做企业级开发?很多刚入行的朋友可能觉得桌面端已经过时了,Web和移动端才是主流。但我在一线做了十多年企业…

2026/10/14 22:52:29 阅读更多 →
WinForm企业级开发框架源码解析:多层架构与权限管理实战

WinForm企业级开发框架源码解析:多层架构与权限管理实战

这套WinForm企业级开发框架源码,我拿到手之后直接先跑了一遍。先说结论:它不是一个简单的界面模板,而是把企业管理系统常用的那套骨架——用户管理、角色权限、字典数据、操作日志、通用增删改查、模块化菜单——全都沉淀成了可复用的代码。底…

2026/10/14 22:52:29 阅读更多 →
iOS图片轮播UIScrollView循环滚动实现与避坑指南

iOS图片轮播UIScrollView循环滚动实现与避坑指南

简介:这是一份面向iOS开发者的图片轮播组件源码,基于UIScrollView实现无限循环滚动效果,适合需要在应用中快速集成Banner轮播的初中级开发者参考使用。源码支持加载网络图片、图片点击响应、pageControl显示开关、自动滚动开关以及滚动时间间…

2026/10/14 22:52:29 阅读更多 →

最新新闻

评分标准逐条对不上,标书白写?按评分项生成标书的5步实操流程

评分标准逐条对不上,标书白写?按评分项生成标书的5步实操流程

做过投标的人都懂这种憋屈:招标文件三百页,评分标准散落在附件、表格、正文注释里,翻了三遍还是怕漏。方案写了几万字,评委却只盯着评分表打分——评分表里没认的内容,写得再漂亮也不加分。行业调研数据也印证了这点&a…

2026/10/15 0:18:15 阅读更多 →
标书提效实测:标捷智写、WPS AI、通义千问、标小信对比

标书提效实测:标捷智写、WPS AI、通义千问、标小信对比

一、先说一个大家都熟悉的场景做过投标的人都懂,一年里最不缺的就是“时间不够”。手里同时压着三五个项目,每份招标文件几百页,评分办法藏在附录,废标条款散在正文各处,技术部门催着要方案,商务领导盯着节…

2026/10/15 0:18:15 阅读更多 →
紧急投标只剩三五天,技术标怎么写完?一套可落地的赶标流程拆解

紧急投标只剩三五天,技术标怎么写完?一套可落地的赶标流程拆解

做过政企投标的朋友大概都遇过这种场面:招标公告刚挂出来,截标日期却卡在三天后,技术方案还得从零开始写。尤其是信息化、智能化这类项目,技术标动辄两三百页,人工翻招标文件、对评分点、逐章码字,两到三周…

2026/10/15 0:18:15 阅读更多 →
多智能体流匹配与解耦生成引导:当生成模型开始“守规矩“

多智能体流匹配与解耦生成引导:当生成模型开始“守规矩“

从今天觉醒,技术赋予每一个人数字生命多智能体流匹配与解耦生成引导:当生成模型开始"守规矩" ① 技术背景:生成模型的"最后一公里"问题 生成模型这几年在图像、文本、机器人轨迹上表现亮眼,但一个尴尬的事实是&#xff1…

2026/10/15 0:18:15 阅读更多 →
LC.99恢复二叉搜索树:中序遍历定位错误节点与Morris O(1)解法

LC.99恢复二叉搜索树:中序遍历定位错误节点与Morris O(1)解法

刷题刷到 LC.99 的那天晚上,我盯着"恢复二叉搜索树"这六个字想了很久:一棵二叉搜索树里只有两个节点的值被错误交换,要我把它恢复成合法状态。第一反应是"这怕不是要重建整棵树",结果冷静下来才发现&#xff…

2026/10/15 0:17:15 阅读更多 →
高德地图绘制实战:覆盖物、坐标体系与轨迹回放全解析

高德地图绘制实战:覆盖物、坐标体系与轨迹回放全解析

简介:高德地图绘制是一份面向GIS开发、前端工程师及移动应用开发初学者的实例资源,围绕高德地图JavaScript API讲解驾车与步行线路的绘制流程,涵盖密钥申请、地图初始化、路线规划、Polyline绘制以及Marker标注等核心环节。压缩包共0个文件&a…

2026/10/15 0:17:15 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →