代码随想录算法训练营第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])
- 寻根思路:举例 A.B.C三个元素连通
- 路径压缩:
- 除了根节点以外所有节点都挂载在根节点下
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()