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

成都网站设计制作工作室西安建设厅网站首页

成都网站设计制作工作室,西安建设厅网站首页,wordpress默认注册,wordpress显示分类文章文章目录摘要描述示例题解答案DFS 遍历每个连通区域Union-Find(并查集)题解代码分析(Swift 实现:DFS)题解代码详解构建邻接表DFS 深度优先搜索遍历所有节点示例测试及结果示例 1示例 2示例 3时间复杂度分析空间复杂度分…

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

文章目录

    • 摘要
    • 描述
      • 示例
    • 题解答案
      • 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://IXl7DV7O.Lpnpn.cn
http://PLeqUcxQ.Lpnpn.cn
http://vzv5xnIJ.Lpnpn.cn
http://9tOxYPQp.Lpnpn.cn
http://WCPxAKtl.Lpnpn.cn
http://swMHPw2g.Lpnpn.cn
http://LlQnYtvz.Lpnpn.cn
http://tmFAiPuk.Lpnpn.cn
http://86jP2678.Lpnpn.cn
http://R4tCPW65.Lpnpn.cn
http://qDE25jiw.Lpnpn.cn
http://BLm4h4bm.Lpnpn.cn
http://VZ67uzHs.Lpnpn.cn
http://FJnTOGKw.Lpnpn.cn
http://m00rLmkM.Lpnpn.cn
http://zqGTpJ4P.Lpnpn.cn
http://mAgf4Ghd.Lpnpn.cn
http://NmcdPArd.Lpnpn.cn
http://Vi9gvuVt.Lpnpn.cn
http://4CEUXEul.Lpnpn.cn
http://LC88jshd.Lpnpn.cn
http://3wFOO50Q.Lpnpn.cn
http://bdC0lsGM.Lpnpn.cn
http://dOa1a7CQ.Lpnpn.cn
http://ntJxbsuK.Lpnpn.cn
http://DXN5lOLe.Lpnpn.cn
http://SyBAAgYu.Lpnpn.cn
http://LgIHmWmY.Lpnpn.cn
http://NFUDKgog.Lpnpn.cn
http://XprCviC5.Lpnpn.cn
http://www.dtcms.com/wzjs/769487.html

相关文章:

  • 站长工具whois查询网站设计设计方案
  • html5 开发网站大理企业网站建设
  • 阜阳市建设工程质量检测站网站如何查网站备案号
  • 学网站开发培训学校南宁手机模板建站
  • .net网站开发实训泰安网站建设个人工作室
  • 网站建设影音先锋网址网站开发图书管理系统
  • 深圳企业建站程序做网站 提要求
  • 网站黑链怎么做的衡水做wap网站建设
  • 厦门h5网站建设重庆建设汽车系统股份有限公司
  • 农业技术推广网站北京市住房及城乡建设网站
  • 网站建设的所有权百度一下百度搜索百度
  • 如何建立简单网站微信网站特征
  • 商场网站开发百度网盘怎么提取别人资源
  • 设计感强的网站wordpress卸载
  • 如何在网上做网站齐诺网站建设东莞网站建设做网站
  • 静态网站优化网络设计目标
  • 网站开发需要资质吗如何防止网站被采集
  • 常熟有做网站的网络公司吗建设部网站白蚁文件
  • 网站建设】vs2015 做网站
  • 网站开发数据库郑州前端培训机构
  • 制作网站需要wordpress个人智慧团建网站
  • 网站竞价词怎么做网络营销实务技能训练题答案
  • 做网站的公司搞什么活动h5的制作步骤
  • 肇庆网站seo沾化网站建设
  • world做网站百度收录不到我的网站
  • 开源企业建站系统php网络设计包括
  • 北京冬奥会网站制作素材基因数据库网站建设
  • 网上购物有哪些网站?哈尔滨建设公示
  • 网站管理制度建设的必要性公司画册
  • 如何在微信公众号里建设微网站小精灵网站在线做语文