首页 > 编程语言 >代码随想录算法训练营第57天 | 并查集理论基础

代码随想录算法训练营第57天 | 并查集理论基础

时间:2024-08-02 11:17:31浏览次数:20  
标签:__ return 随想录 57 查集 father find def

并查集理论基础
https://www.programmercarl.com/kamacoder/图论并查集理论基础.html
107.寻找存在的路径
https://kamacoder.com/problempage.php?pid=1179
代码随想录
https://www.programmercarl.com/kamacoder/0107.寻找存在的路径.html#思路

并查集理论基础

并查集用于判断连通性问题:判断两个元素是否在同一个集合里的时候

  • 并查集的功能
    • 将两个元素添加到一个集合中
    • 判断两个元素在不在同一个集合
  • 原理
    • 寻根思路:举例 A.B.C三个元素连通
      • 定义:Father[A]=B Father[B] = C father[C] = C
      def join(u,v): ##这两个元素的根一致,建立关系;
      	u = find(u)
      	v = find(v)
      	if (u==v):
      		return
      	father[v] = n
      
      • 一路寻根:A的根是C B的根也是C C的根也是C
      def Init(father,n): ##根本身为自己
      	for i in range(n):
      		fathre[i] = i
      
      def find(u):
      	if u==father[u]:return u
      	else:
      		return find(father[u])
      
  • 路径压缩:
    • 除了根节点以外所有节点都挂载在根节点下
      def find(u):
      	if u==father[u]:return u
      	else:
      		father[u] = find(father[u]) ##直接挂载在根节点下
      		return father[u]
      
    • 判断是否在一个集合下
      def issame(u,v):
      	u = find(u)
      	v = find(v)
      	return u==v
      ```****
      
      

107. 寻找存在的路径

  • 按照流程执行

    点击查看代码
    def find(father,i):
    	if i==father[i]:
    		return
    	else:
    		father[i] = find(father,i)
    		return father[i]
    
    def join(father,u,v):
    	u = find(father,u)
    	v = find(father,v)
    	if u==v:
    		return
    	father[v] = u
    
    def issame(father,u,v):
    	u = find(father,u)
    	v = find(father,v)
    	return u==v
    
    def main():
    	n,m = map(int,input().split())
    	father = [i for i in range(n+1)]
    	for i in range(m):
    		u,v = map(int,input().split())
    		join(father,u,v)
    	source,destination = map(int,input().split())
    	if issame(father,source,destination):
    		print("1")
    	else:
    		print("0")
    
    if __name__ == '__main__':
    	main()
    

标签:__,return,随想录,57,查集,father,find,def
From: https://www.cnblogs.com/P201821440041/p/18337132

相关文章

  • 代码随想录算法训练营第二十五天|134. 加油站、135. 分发糖果、860.柠檬水找零、406.
    写代码的第二十五天继续贪心!!gogogo!134.加油站思路贪心算法总让我有种脑子知道每次怎么计算,但是写不出来,也想不出贪心贪在哪里了,就只是觉得应该这么做。。。。。本题中大家可以按照自己的计算方法一步一步模拟一下这个过程,然后会发现其实每次都是要计算每站剩余的油量,......
  • 代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763
    写代码的第二十六天继续贪心贪心!!!452.用最少数量的箭引爆气球思路最少的弓箭引爆气球,那么就是要看有没有重复覆盖的区域,如果有的话,那么一个弓箭就能引爆重复区域的气球,所以本题就是要看有多少气球是重复的,如果重复就用一根弓箭,如果不重复就加一。解决问题1:如何判断是否......
  • 代码随想录算法训练营第二十七天| 56. 合并区间、738.单调递增的数字
    写代码的第二十七天最后一天贪心!!!加油呀!!!56.合并区间思路这道题本质上和昨天的两道题是几乎完全一致的,都是判断重叠区间,只不过昨天的射箭那道题是统计有多少重叠区间,无重叠区间那道题是找到重叠区间然后删除,这道题是找到重叠区间然后合并。解决问题1:如何对重叠区间进行......
  • 「代码随想录算法训练营」第二十六天 | 贪心算法 part4
    452.用最少数量的箭引爆气球题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/题目难度:中等文章讲解:https://programmercarl.com/0452.用最少数量的箭引爆气球.html视频讲解:https://www.bilibili.com/video/BV1SA41167xe题目状态:有点思路......
  • 「代码随想录算法训练营」第二十五天 | 贪心算法 part3
    134.加油站题目链接:https://leetcode.cn/problems/gas-station/题目难度:中等文章讲解:https://programmercarl.com/0134.加油站.html视频讲解:https://www.bilibili.com/video/BV1jA411r7WX题目状态:没有思路,学习题解思路一:全局最优解首先将所有路径的加油量和耗油量加一起......
  • 代码随想录Day2
    209.长度最小的子数组给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组$[nums_l,nums_{l+1},...,nums_{r-1},nums_r]$,并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=......
  • ESP32 使用MAX98357 播放MP3
    使用ESP32和MAX98357音频放大器芯片来播放音乐,效果令人惊叹! 【ESP32开发指南】   首先使用ESP32板和MAX98357芯片进行了简单的接线,下载了ArduinoI2S的库,然后用ArduinoIDE并编写了一些简单的代码来实现音乐播放。当我们启动程序并播放这首歌时,我们听到了一个令人惊叹的......
  • 代码随想录算法训练营第56天 | 广搜和深搜应用
    110.字符串接龙https://kamacoder.com/problempage.php?pid=1183代码随想录https://www.programmercarl.com/kamacoder/0110.字符串接龙.html#思路105.有向图的完全可达性https://kamacoder.com/problempage.php?pid=1177代码随想录https://www.programmercarl.com/kamaco......
  • 代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/description/本人代码:classSolution{public:intsearch(vector<int>&nums,inttarget){intlow=0,high=nums.size()-1;//此处分情况讨论returnsearchTarget(nums,low,high,tar......
  • 代码随想录day16 || 513 树左下角值,112 路径之和,116 中序后序遍历构造二叉树
    切片传递问题question:什么情况下传递切片,什么情况下传递切片指针,为什么有时候会修改原始副本,有时候又不会呢?typesli[]intfuncmain(){ slice:=[]int{1} fmt.Printf("slice:%p\n",slice) change1(slice) fmt.Println("=================================") s2:=......