在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
      • 示例
    • 题解答案
      • DFS 遍历每个连通区域
      • Union-Find(并查集)
    • 题解代码分析(Swift 实现:DFS)
    • 题解代码详解
      • 构建邻接表
      • DFS 深度优先搜索
      • 遍历所有节点
    • 示例测试及结果
      • 示例 1
      • 示例 2
      • 示例 3
    • 时间复杂度分析
    • 空间复杂度分析
    • 总结

摘要

图是算法中最具挑战性的结构之一,而“连通分量”这个词听起来也有点像社交网络里的“圈子”概念。给你一张无向图,节点编号从 0 到 n-1,现在请你找出这个图中到底有多少个互相连着的群体(连通分量)

这题其实在很多实际问题里都能找到身影,比如社交图谱分析、网络故障检测、孤岛计算等等。

这篇文章将用 Swift 带你搞懂这题背后的图遍历方法(DFS 和并查集两种思路),并提供完整代码与解释。

描述

给定一个由 n 个节点(编号为 0n - 1)组成的无向图和一个边列表 edges,请你计算图中连通分量的数量。

示例

输入:

n = 5
edges = [[0, 1], [1, 2], [3, 4]]

输出:

2

解释:图中有两个连通分量:{0,1,2} 和 {3,4}

题解答案

这题有两个常见解法:

DFS 遍历每个连通区域

把图看成是一个邻接表,然后从没访问过的点开始 DFS,把一个区域内的所有点标记为访问过。每发现一个新未访问的节点,就说明有一个新的连通分量。

Union-Find(并查集)

通过并查集把每个点合并成“祖宗节点”,合并所有连通的点,最后统计有多少个不同的祖宗节点,就是连通分量的数量。

我们下面会实现 DFS 方法,它更直观易懂,特别适合初学者。

题解代码分析(Swift 实现:DFS)

func countComponents(_ n: Int, _ edges: [[Int]]) -> Int {var graph = [Int: [Int]]()for edge in edges {graph[edge[0], default: []].append(edge[1])graph[edge[1], default: []].append(edge[0])}var visited = Set<Int>()var components = 0func dfs(_ node: Int) {if visited.contains(node) { return }visited.insert(node)for neighbor in graph[node, default: []] {dfs(neighbor)}}for i in 0..<n {if !visited.contains(i) {components += 1dfs(i)}}return components
}

题解代码详解

构建邻接表

var graph = [Int: [Int]]()
for edge in edges {graph[edge[0], default: []].append(edge[1])graph[edge[1], default: []].append(edge[0])
}

这段代码会把每一对连接关系存进字典,形成一个“谁连着谁”的列表。

DFS 深度优先搜索

func dfs(_ node: Int) {if visited.contains(node) { return }visited.insert(node)for neighbor in graph[node, default: []] {dfs(neighbor)}
}

从某个起点开始,一路访问下去,把整个连通区域的点都标记为“访问过”。

遍历所有节点

for i in 0..<n {if !visited.contains(i) {components += 1dfs(i)}
}

每当我们发现一个还没被访问的点,就说明它是一个新连通分量的起点,我们就从它出发去搜索这个“朋友圈”。

示例测试及结果

示例 1

let count1 = countComponents(5, [[0, 1], [1, 2], [3, 4]])
print(count1) // 输出:2

示例 2

let count2 = countComponents(4, [[0, 1], [2, 3]])
print(count2) // 输出:2

示例 3

let count3 = countComponents(5, [[0, 1], [1, 2], [2, 3], [3, 4]])
print(count3) // 输出:1

时间复杂度分析

  • 构建图:O(E)
  • DFS 总遍历所有节点和边:O(N + E)
  • 总体时间复杂度:O(N + E),其中 N 是节点数,E 是边数

空间复杂度分析

  • 图邻接表:O(N + E)
  • 访问集合:O(N)
  • DFS 栈空间:O(N)
  • 总体空间复杂度:O(N + E)

总结

这道题非常适合作为图算法入门练手题,掌握它你会收获:

  • 如何从边列表构建图结构
  • 如何用 DFS 找出连通区域
  • 连通分量的概念实际是“有几个不相交的图”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88340.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88340.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88340.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【剑指offer】栈 队列

&#x1f4c1; JZ9 用两个栈实现队列一个栈in用作进元素&#xff0c;一个栈out用于出元素。当栈out没有元素时&#xff0c;从in栈获取数据&#xff0c;根据栈的特性&#xff0c;栈out的top元素一定是先进入的元素&#xff0c;因此当栈out使用pop操作时&#xff0c;一定时满足队…

GoView 低代码数据可视化

纯前端 分支&#xff1a; master &#x1f47b; 携带 后端 请求分支: master-fetch &#x1f4da; GoView 文档 地址&#xff1a;https://www.mtruning.club/ 项目纯前端-Demo 地址&#xff1a;https://vue.mtruning.club/ 项目带后端-Demo 地址&#xff1a;https://demo.mtrun…

Spring Boot返回前端Long型丢失精度 后两位 变成00

文章目录一、前言二、问题描述2.1、问题背景2.2、问题示例三、解决方法3.1、将ID转换为字符串3.2、使用JsonSerialize注解3.3、使用JsonFormat注解一、前言 在后端开发中&#xff0c;我们经常会遇到需要将ID作为标识符传递给前端的情况。当ID为long类型时&#xff0c;如果该ID…

计算机网络实验——无线局域网安全实验

实验1. WEP和WPA2-PSK实验一、实验目的验证AP和终端与实现WEP安全机制相关的参数的配置过程。验证AP和终端与实现WPA2-PSK安全机制相关的参数的配置过程。验证终端与AP之间建立关联的过程。验证关闭端口的重新开启过程。验证属于不同BSS的终端之间的数据传输过程。二、实验任务…

【从零开始学Dify】大模型应用开发平台Dify本地化部署

目录Dify一、本地化部署1、安装docker2、安装Dify&#xff08;1&#xff09;拉取代码到本地&#xff08;2&#xff09;docker部署&#xff08;3&#xff09;查看服务状态&#xff08;4&#xff09;web端部署&#xff08;5&#xff09;登录二、可能会出现的问题&#xff08;1&am…

LVGL应用和部署(和物理按键交互)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】屏幕除了显示部分&#xff0c;还要去和其他外设进行交互&#xff0c;这是非常重要的一个处理方法。我们知道&#xff0c;不管是mcu&#xff0c;还是…

限流式保护器如何筑牢无人驾驶汽车充电站的安全防线

摘要&#xff1a; 随着新能源汽车&#xff0c;尤其是无人驾驶车队的快速发展&#xff0c;充电设施的安全可靠性至关重要。交流充电桩&#xff08;俗称“慢充桩”&#xff09;作为重要的充电基础设施&#xff0c;其末端回路的安全保护需满足国家标准GB51348-2019的严格要求&…

专题:2025母婴行业洞察报告|附60+份报告PDF汇总下载

原文链接&#xff1a;https://tecdat.cn/?p42908 全球母婴市场正经历结构性增长&#xff0c;一面是欧美成熟市场的品质消费升级&#xff0c;一面是东南亚、中东等新兴市场的人口红利释放。2020至2026年&#xff0c;全球母婴市场规模将从1859亿美元增至3084亿美元&#xff0c;年…

从零搭建多商户商城系统源码:技术栈、数据库设计与接口规划详解

如今&#xff0c;多商户商城系统已成为传统零售转型与新型电商平台构建的关键利器。无论是打造像某宝、某东这样的综合型平台&#xff0c;还是服务于垂直行业的独立电商&#xff0c;一套高效、可扩展的多商户商城系统源码&#xff0c;往往决定着平台的成败。 今天&#xff0c;小…

在Docker中运行macOS的超方便体验!

在数字化和开发人员快速迭代的今日&#xff0c;拥有一个便捷、高效的开发环境成为每个开发者梦寐以求的事情。特别是在需要操作多个系统、开发跨平台应用时&#xff0c;调试和测试的便利性显得尤为重要。今天为大家介绍的这款开源项目&#xff0c;正是一个解决此类问题的利器—…

Kettle导入Excel文件进数据库时,数值发生错误的一种原因

1、问题描述及原因 在使用kettle读取Excel文件、并导入数据库时&#xff0c;需要读取Excel中的数值、日期(或日期时间、时间)、文本这三种类型的列进来&#xff0c;发现读取其中的数值时&#xff0c;读取的数字就不对。 经调查&#xff0c;原因是&#xff0c;在“导出数据为E…

Windows安装DevEco Studio

1. 概述 DevEco Studio是华为基于IDEA Community开源工具开发的一站式HarmonyOS应用及元服务开发平台&#xff0c;为开发者提供代码开发、编译构建以及调测等功能 2. 运行环境要求 操作系统&#xff1a;Windows10 64位、Windows11 64位 内存&#xff1a;16GB及以上 硬盘&…

PLC框架-1.3.2 报文750控制汇川伺服的转矩上下限

本文介绍1200PLC如何使用750报文设定伺服转矩的上下限。 750号报文 PLC---->伺服 (控制) 伺服--->PLC (状态) PZD1

Redis知识集合---思维导图(持续更新中)

一、Redis中常见的数据类型有哪些&#xff1f;二、Redis为什么这么快&#xff1f;三、为什么Redis设计为单线程&#xff1f;6.0版本为何引入多线程&#xff1f;四、

mac m1安装大模型工具vllm

1 更新系统环境 参考vllm官网文档&#xff0c;vllm对apple m1平台mac os, xcoder, clang有如下要求 OS: macOS Sonoma or later SDK: XCode 15.4 or later with Command Line Tools Compiler: Apple Clang > 15.0.0 在App Store更新macOS和XCoder&#xff0c;依据XCoder版本…

解锁localtime:使用技巧与避坑指南

目录 一、引言 1.1 背景与目的 1.2 localtime 函数简介 二、localtime 函数详解 2.1 函数原型与参数 2.2 返回值与 tm 结构体 2.3 基本使用示例 三、localtime 函数的缺陷剖析 3.1 多次调用同一共享区间导致错误 3.1.1 问题现象展示 3.1.2 原因深入分析 3.1.3 实际影…

郑州机械设计研究所 -PHM产品序列概览

1.设备状态监测系统 动态信号监测很像是三个独立通道&#xff0c;振动&#xff0c;转速&#xff0c;然后高频的某个频带。或者是同一个振动信号做的低频和高频两个带通&#xff0c;时域和频域组图。实时检测&#xff0c;很明显是24个时 -频指标。 动态分析看起来像趋势图。 2.…

《棒垒球知道》奥运会的吉祥物是什么·棒球1号位

Olympic Mascots & Baseball/Softball Games History ⚾&#xff08;奥运吉祥物与棒垒球赛事全科普&#xff09;1984洛杉矶奥运会 / Los Angeles 1984Mascot: Sam the Eagle&#xff08;山姆鹰&#xff09;美国精神象征&#xff0c;红白蓝配色超吸睛&#xff01;Baseball/S…

【提高篇-基础知识与编程环境:1、Linux系统终端中常用的文件与目录操作命令】

Linux终端提供了丰富的命令来操作文件和目录&#xff0c;以下简单介绍一些常用的命令&#xff1a; 一、目录操作命令 pwd - 显示当前工作目录 pwd #输出当前所在目录的绝对路径 cd - 切换目录 cd /path/to/directory # 切换到指定目录 cd … # …

前端性能优化:从之理论到实践的破局道

&#x1f680; 前端性能优化&#xff1a;从之理论到实践的破局道 摘要&#xff1a;本文针对首屏加载、渲染卡顿等核心痛点&#xff0c;结合当前主流技术栈给出可落地的优化方案一、为什么你的页面"又慢又卡"&#xff1f; 用户真实体验数据&#xff1a; 加载时间超过3…