LeetCode 547:省份数量,把邻接矩阵看成图的连通分量

题目要求 给你一个 n x n 的矩阵 isConnected,其中有 n 个城市。 如果 isConnected[i][j] == 1,说明城市 i 和城市 j 直接相连;如果两个城市可以通过若干个直接相连的城市互相到达,它们就属于同一个省份。 题目要求返回省份的总数。 这里最容易误解的一点是:题目不是让我们数矩阵里有多少个 1,也不是只看直接相连的城市对。它真正要数的是: 直接或间接连接在一起的城市组有多少个。 换成图的语言,就是: 给定一个无向图的邻接矩阵,返回这个图的连通分量数量。 输入输出 输入:isConnected: List[List[int]] 输出:省份数量 int 城市编号可以按 0..n-1 理解。 isConnected[i][j] == 1 表示城市 i 和城市 j 之间有边。 isConnected[i][j] == 0 表示城市 i 和城市 j 没有直接边。 示例 1 输入:isConnected = [ [1, 1, 0], [1, 1, 0], [0, 0, 1] ] 输出:2 城市 0 和城市 1 直接相连,所以它们属于同一个省份。 ...

2026年5月27日 · 6 分钟 · map[name:Jeanphilo]

连通分量与强连通分量:Tarjan / Kosaraju 工程 ACERS 解析

副标题 / 摘要 连通分量是图算法的基础地基:无向图关注“是否连在一起”,有向图关注“是否互相可达”。本文按 ACERS 模板,从朴素做法推导到 Tarjan / Kosaraju,并给出图数据库落地场景与多语言可运行实现。 预计阅读时长:14~18 分钟 标签:图论、连通分量、SCC、Tarjan SEO 关键词:Connected Components, SCC, Tarjan, Kosaraju, 图数据库 元描述:从无向连通分量到有向强连通分量,讲清 Tarjan/Kosaraju 的核心机制、复杂度和工程落地。 目标读者 需要把 BFS/DFS 用到“滚瓜烂熟”的算法学习者 在图数据库场景做子图分析、分片规划的工程师 想建立“无向 CC + 有向 SCC”统一认知框架的中级开发者 背景 / 动机 工程里你会很快遇到这三类问题: 这批节点是否天然分成多个互不相连的群?(无向图连通分量) 哪些节点形成“互相可达”的强闭环?(有向图 SCC) 如何把大图切成更可并行、更易缓存、更易分片的子图? 如果只会 BFS/DFS 但不会“分量视角”,你会反复做可达性查询,成本高且难维护。 连通分量算法的价值是:一次全图扫描,把局部查询变成 O(1) 的分量 ID 比较。 核心概念 Connected Components(CC):无向图中,任意两点都可达的最大节点集合 Strongly Connected Components(SCC):有向图中,任意两点互相可达的最大节点集合 Condensation DAG(缩点图):把每个 SCC 缩成一个点后得到的有向无环图 Tarjan 核心状态:dfn[u](时间戳),low[u](可回溯到的最小时间戳),栈与 in_stack Kosaraju 核心流程:原图按完成时序排序 + 反图二次 DFS A — Algorithm(题目与算法) 题目还原(工程化表述) 给定一个图 G=(V,E): ...

2026年2月9日 · 7 分钟 · map[name:Jeanphilo]