要判断不同的n的根之间是否有连接,可以使用并查集(Disjoint Set)数据结构来解决。并查集是一种用于处理集合合并与查找问题的数据结构。
以下是使用并查集判断不同的n的根之间是否有连接的示例代码:
class DisjointSet:
def __init__(self, size):
self.parent = [i for i in range(size + 1)] # 初始化每个元素的父节点为自身
self.rank = [0] * (size + 1) # 记录每个集合的秩(树的高度)
def find(self, x):
if self.parent[x] != x:
# 路径压缩,将x的父节点直接设为根节点,减少后续查找的时间复杂度
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
root_x = self.find(x)
root_y = self.find(y)
if root_x != root_y:
# 按秩合并,将秩较小的树合并到秩较大的树上
if self.rank[root_x] < self.rank[root_y]:
self.parent[root_x] = root_y
elif self.rank[root_x] > self.rank[root_y]:
self.parent[root_y] = root_x
else:
self.parent[root_y] = root_x
self.rank[root_x] += 1
使用示例:
def has_connection(n, pairs):
ds = DisjointSet(n)
for pair in pairs:
ds.union(*pair) # 合并n的根节点
# 判断是否只有一个根节点,即是否存在连接
return len(set(ds.parent[1:])) == 1
示例调用:
pairs = [(1, 2), (3, 4), (5, 6)]
print(has_connection(6, pairs)) # 输出 True
pairs = [(1, 2), (2, 3), (4, 5)]
print(has_connection(5, pairs)) # 输出 False
以上代码使用了路径压缩和按秩合并的优化策略,可以在较快的时间内判断不同的n的根之间是否有连接。