并查集
具体概念就不赘述了,主要写一下python的实现
# 1 2 3 4
#[-1 -1 -1 -1 -1]
class DSU:
def __init__(self, nums):
self.root_relation_list = [-1] * (nums+1) # 如果从一开始 初始化父节点列表 需要(nums+1),从0开始则不用
def find_root_node(self, node): # 找父节点
while self.root_relation_list[node] != -1: # 即如果node的父节点不是-1,则继续网上找
node = self.root_relation_list[node] # 更新node
return node
def node_connect(self, node1, node2): # 将两个节点相连
node1_root = self.find_root_node(node1)
node2_root = self.find_root_node(node2)
if node1_root != node2_root:
self.root_relation_list[node1_root] = node2_root
else:
print("connected")
return
dsu = DSU(4)
print(dsu.root_relation_list)
dsu.node_connect(1, 2)
dsu.node_connect(3, 4)
dsu.node_connect(1, 4)
print(dsu.find_root_node(2))
print(dsu.root_relation_list)
Out:
[-1, -1, -1, -1, -1]
4
[-1, 2, 4, 4, -1]
例题
LeetCode-684-冗余连接
在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。
返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。
示例:
输入: [[1,2], [1,3], [2,3]]
输出: [2,3]
解释: 给定的无向图为:
1
/ \
2 - 3
输入: [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]
解释: 给定的无向图为:
5 - 1 - 2
| |
4 - 3
思路:如果输入 [1,2] 没连接,则连上;输入[1,3]没连接则连上;输入[1,3],发现已经连接,则输出。
题解
class DSU:
def __init__(self,node_nums):
self.root_relation_list = [-1]*(node_nums + 1)
def find_node_root(self,node):
while self.root_relation_list[node] != -1:
node = self.root_relation_list[node]
return node
def node_connect(self, node1, node2):
node1_root = self.find_node_root(node1)
node2_root = self.find_node_root(node2)
if node1_root != node2_root:
self.root_relation_list[node1_root] = node2_root
else:
pass
return
class Solution:
def findRedundantConnection(self,edges):
node_set = set()
for node in edges:
node_set.add(node[0])
node_set.add(node[1])
nums = len(node_set)
dsu = DSU(nums)
res = []
for node in edges:
firstnode_root = dsu.find_node_root(node[0])
secondnode_root = dsu.find_node_root(node[1])
if firstnode_root != secondnode_root:
dsu.node_connect(firstnode_root, secondnode_root)
else:
res = node
return res
solution = Solution()
print(solution.findRedundantConnection([[1,2], [2,3], [3,4], [1,4], [1,5]]))