python实现蓝桥杯历届试题之合根植物(查并集)
代码改自:合根植物Java实现
查并集
它是一种用树表示的数据结构。根节点存储所有节点总数的负数。子节点中存储它双亲结点的位置。
具体的在该博主的文章中有具体的介绍:查并集
代码
# 合根植物python实现
def init(m, n):
"""
初始化矩阵。
:param m: 行数
:param n: 列数
:return: 一个初始化好的矩阵
"""
global plantList
plantList = [None] * (m*n+1)
for i in range(0,m*n+1):
plantList[i] = i
def find(num):
global plantList
return num if num == plantList[num] else find(plantList[num]) # 找到这个根,也就是合并集
def join(a, b):
a = find(a)
b = find(b)
if a != b:
plantList[a] = b
if __name__ == '__main__':
plantList = [] # 初始化一个列表
m,n = [int(i) for i in input().split()]
k = eval(input()) # 输入的数据数
init(m, n)
# 现在开始输入数据
for i in range(k):
a,b = [int(i) for i in input().split()]
join(a,b)
sums = 0
for i in range(1,m*n+1):
if plantList[i] == i:
sums += 1
print(sums)
这里我们没有创建二维数组,是因为列表的下标和里面的元素共同构成了一个二维的矩阵。
同时,我们初始化了21个值的原因,也是因为我们希望下标从1开始,这样方便处理。