python 蓝桥杯之并查集

news/2024/6/18 21:39:27 标签: python, 蓝桥杯

文章目录

  • 总述
  • 合并过程
  • 查找过程
  • 算法实战
    • 实战1

总述

并查集(Disjoint-set Union,简称并查集)是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题,通常涉及到以下两种操作:

  1. 合并(Union): 将两个集合合并成一个集合。
  2. 查询(Find): 查找某个元素所属的集合。

并查集通常应用于解决连接问题,如判断无向图中的连通分量、网络连接状态的判断、社交网络中的好友关系等。在算法竞赛和数据结构课程中也经常会涉及到并查集的应用场景,比如 Kruskal 算法中的边权值排序,以及求解最小生成树等。

合并过程

在这里插入图片描述

在这里插入图片描述

  • 合并的过程就是先找到两个元素的根,若根不相同则将其中的一个根的父节点改成另一个根节点
python">s = [i for i in range(N+1)]  # 列表s[i] 表示i 节点的父节点,开始的时候,全部指向自己
def union(x,y):
	r1 = find(x)
	r2 = find(y)
	if r1 != r2:
		s[r1] = s[r2]
	

查找过程

在这里插入图片描述

  • 对于查找的过程,就是一直找
python">def find(x):  # 返回 x 的根节点
	if x != s[x]:
		s[x] = find(s[x])
	return s[x]



算法实战

实战1

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

python">from collections import defaultdict

n = int(input())
p = [i for i in range(n + 1)] # p[i] 表示 节点 i 的父节点
tree = defaultdict(list) # 输入键,当键不存在就生成键:列表
used = [0] * (n + 1) # 用来记录是否访问过
ans = [0] * n  # 用来反复记录路径


def find(x):    # 并查集的查找函数,返回x 节点的根
    if x != p[x]:
        p[x] = find(p[x])
    return p[x]


def dfs(pos, idx):
    ans[idx] = pos
    if pos == end:
        res = sorted(ans[:idx + 1]) # 排序
        print(' '.join(map(str, res))) # 输出,间隔空格输出 
        return

    for d in tree[pos]: # 逐一访问节点的邻接节点
        if not used[d]: # 由于是无向图,并且加上深度搜索,所以要记录一个节点是否已经访问过
            used[d] = 1
            dfs(d, idx + 1)


for _ in range(n):
    u, v = map(int, input().split()) 
    tu, tv = find(u), find(v) 
    if tu == tv:
        start, end = u, v  
        break  # 所以是不必加载全部的边的关系的,因为当两个输入的节点的根相同的时候,就说明已经包含环了
    else:
        p[tv] = tu
        tree[u].append(v)
        tree[v].append(u) # 无向图

used[start] = 1
dfs(start, 0) 

代码分析

  • 不能直接暴力地去深度搜索,会超时
  • 用并查集来判断两个节点是否位于不同的连通分支
  • 并查集并不是死板地运用全部的合并和查找函数
  • 深度搜索只是一种工具并不是死板地运用全部的框架

http://www.niftyadmin.cn/n/5416949.html

相关文章

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明:正弦波。x:NumPy数组 # 所有的数据,进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…

HTML5 基础1

<b> 和 <strong>的异同 相同点&#xff1a;在显示上&#xff0c;这两个标签都是加粗文本。 不同点&#xff1a;使用网页阅读器阅读网页&#xff08;盲人使用&#xff09;&#xff0c;strong 会重读&#xff0c;b 则不会。从起源上来说&#xff0c;strong 是为了在…

解决约束满足问题的SMT求解器——基于z3+Python的入门案例

文章目录 1. 前言2. 约束满足问题 CSP/SAT/SMT 的联系与区别2.1 Constraint Satisfaction Problem2.2 Boolean Satisfiability Problem2.3 Satisfiability Modulo Theories3. SMT 求解器 —— z3-solver3.1 通过 pip 安装 z33.2 基于Python的入门案例1. 前言 近年来,在一些实…

信息系统项目管理师003:信息化(1信息化发展—1.1信息与信息化—1.1.3 信息化)

文章目录 1.1.3 信息化1.信息化内涵2.信息化体系3.信息化趋势 要点总结 1.1.3 信息化 信息化是一个过程&#xff0c;与工业化、现代化一样&#xff0c;是一个动态变化的过程。信息化是指培养、发展以计算机为主的智能化工具为代表的新生产力&#xff0c;并使之造福于社会的历史…

小白跟做江科大51单片机之AD/DA

1.看原理图找接口 2.看时序图编写读取数据代码 XPT2046.c代码 #include <REGX52.H> //引脚定义 sbit XPY2046_DINP3^4; sbit XPY2046_CSP3^5; sbit XPY2046_DCLKP3^6; sbit XPY2046_DOUTP3^7; unsigned int XPT2046_ReadAD(unsigned char Command) { unsigned char …

C语言死循环是怎样产⽣的?

一、问题 死循环是指程序⽆法退出或者⽆法进⼊下⼀次循环。那么&#xff0c;什么情况会产⽣死循环呢&#xff1f; 二、解答 1、问题的产⽣ C语⾔中常⽤3种循环语句&#xff0c;这些循环语句各有特点&#xff0c;while 和 do...while 经常⽤在循环次数不确定的场合&#xff1b…

律师事务所案件管理新宠:Java+SpringBoot+Vue+MySQL实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

seata2.0服务器日志位置修改

seata2.0日志位置修改 在使用seata的时候我们的日志文件总是会生成在 /root/logs/seata/ *.log 这个位置&#xff0c;与我们的服务部署位置不同&#xff0c;这导致我们查看日志信息非常不方便&#xff0c;所以我们切换一下日志输出位置。 查看配置文件 /conf/application.yaml…