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

并查集理论基础
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()
    
posted @ 2024-08-02 11:17  哆啦**  阅读(1)  评论(0编辑  收藏  举报