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

算法第五十五天:图论part05(第十一章)

并查集理论基础

并查集主要有两个功能:

  • 将两个元素添加到一个集合中。
  • 判断两个元素在不在同一个集合
    class UnionFind:def __init__(self, n):"""初始化并查集"""self.n = nself.father = list(range(n))  # 每个节点自己是根self.rank = [1] * n           # 每棵树初始高度为1def find(self, u):"""查找根节点,同时做路径压缩"""if self.father[u] != u:self.father[u] = self.find(self.father[u])  # 路径压缩return self.father[u]def is_same(self, u, v):"""判断 u 和 v 是否在同一个集合"""return self.find(u) == self.find(v)def join(self, u, v):"""按秩合并 u 和 v 所在集合"""u_root = self.find(u)v_root = self.find(v)if u_root == v_root:return  # 已经在同一个集合# 按秩合并:小树挂到大树下面if self.rank[u_root] < self.rank[v_root]:self.father[u_root] = v_rootelif self.rank[u_root] > self.rank[v_root]:self.father[v_root] = u_rootelse:self.father[u_root] = v_rootself.rank[v_root] += 1
    

    1.寻找存在的路径

    主函数逻辑

    main 函数是程序的执行入口,它负责处理输入、调用并查集的方法,并输出结果。它的步骤是:

    • 读取输入:一次性读取所有输入数据,包括元素的总数 n、操作的次数 m,以及所有的合并和查询数据。

    • 初始化并查集:创建一个 UnionFind(n) 的实例,准备好处理 n 个元素。

    • 执行合并操作:通过一个循环,读取 m 对元素,并对每一对元素调用 uf.union() 方法,将它们所在的集合合并。

    • 执行查询:读取最后需要查询的一对元素 sourcedestination

    • 输出结果:调用 uf.is_same() 方法来判断 sourcedestination 是否属于同一个集合,然后根据结果输出 10

    class UnionFind:

        #每个人的根都指向自己

        def __init__(self, size):

            self.parent = list(range(size+1))

        def find(self, u):

            if self.parent[u] != u:

                self.parent[u] = self.find(self.parent[u]) # 路径压缩

            return self.parent[u]

        def union(self, u, v):

            root_u = self.find(u)

            root_v = self.find(v)

            if root_u != root_v:

                self.parent[root_v] = root_u

        #检查两个元素 u 和 v 是否属于同一个集合(也就是它们是否“连通”)

        def is_same(self, u, v):

            return self.find(u) == self.find(v)

    def main():

        #sys.stdin.read 这个方法有点不一样。它是从标准输入流中一次性读取所有的输入

        import sys

        input = sys.stdin.read

        data = input().split()

        index = 0

        n = int(data[index])

        index += 1

        m = int(data[index])

        uf = UnionFind(n)

        index += 1

        for _ in range(m):

            s = int(data[index])

            index += 1

            t = int(data[index])

            index += 1

            uf.union(s, t)

       

        source = int(data[index])

        index += 1

        destination = int(data[index])

        if uf.is_same(source, destination):

            print(1)

        else:

            print(-1)

    if __name__ == "__main__":

        main()

    今天就到这里了有点难!

    http://www.dtcms.com/a/347421.html

    相关文章:

  • 微服务架构中服务发现机制的实现与优化 NO.3(回复征途黯然.)
  • Navigation2 源码阅读 —— map_server 到底干了哈?
  • 53.Redis持久化-RDB
  • 【golang】制作linux环境+golang的Dockerfile | 如何下载golang镜像源
  • ESP-NOW详解(esp-idf)
  • NFC 电路理论计算
  • 支持电脑课程、游戏、会议、网课、直播录屏 多场景全能录屏工具
  • Python 学习(十六) 下一代 Python 包管理工具:UV
  • 1.十天通关常见算法100题(第一天)
  • 嵌入式LINUX-------------数据库
  • html-docx-js 导出word
  • Redis 从入门到精通:原理、实战与性能优化全解析
  • MySQL InnoDB Buffer Pool详解:原理、配置与性能优化
  • 单元测试的使用以及Vue3-Element Plus入门
  • 【假设微调1B模型,一个模型参数是16bit,计算需要多少显存?】
  • 雷卯针对香橙派Orange Pi 3G-IoT-B开发板防雷防静电方案
  • 结合 Kernel Memory 与 Ollama 实现文档处理与智能问答
  • 51单片机-实现外部中断模块教程
  • 力扣hot100 | 图论 | 200. 岛屿数量、994. 腐烂的橘子、207. 课程表、208. 实现 Trie (前缀树)
  • 【数据分享】2025年全国路网矢量数据道路shp数据
  • Ubuntu 系统中解压 ZIP 文件可以通过图形界面或命令行操作
  • 【设计模式08】组合模式
  • LLaMA-Factory 中配置文件或命令行里各个参数的含义
  • 深度集成Dify API:基于Vue 3的智能对话前端解决方案
  • Maven仓库与Maven私服架构
  • Vue 3 useModel vs defineModel:选择正确的双向绑定方案
  • 自然语言处理——05 Transformer架构和手写实现
  • 微前端架构核心要点对比
  • 小区物业对大楼顶面的巡查通常是定期巡查+特殊情况下的临时巡查相结合
  • 认识模块化及常见考点