并查集
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题
并查集的思想是用一个数组表示了整片森林,树的根节点唯一标识了一个集合,我们只要找到了某个元素的树根,就能确定它在哪个集合里。
n,m=map(int,input().split())
p=[i for i in range(n+1)]
def root(x):
if p[x]!=x:
p[x]=root(p[x])
return p[x]
def union(x,y):
if root(x)!=root(y):
p[root(x)]=root(y)
for i in range(m):
z,x,y=map(int,input().split())
if z==1:
union(x,y)
else:
if root(x)==root(y):
print('YES')
else:
print('NO')
def cost(x,y):
sums=0
while x or y:
if x%10 !=y%10:
sums+=x%10+y%10
x=x//10
y=y//10
return sums
def root(x):
if p[x]!=x:
p[x]=root(p[x])
return p[x]
def union(x,y):
if root(x)!=root(y):
p[root(x)]=root(y)
p=[int(i) for i in range(2022)]
edges=[(i,j,cost(i,j))for i in range(1,2022) for j in range(1,2022)]
edges.sort(key=lambda x:x[2])
ans=0
count=0
for i in edges:
if root(i[0])!=root(i[1]):
union(i[0],i[1])
count+=1
ans+=i[2]
if count==2020:
break
print(ans)
省份数量
class Solution:
def findCircleNum(self, isConnected: List[List[int]]) -> int:
def find(index: int) -> int:
if parent[index] != index:
parent[index] = find(parent[index])
return parent[index]
def union(index1: int, index2: int):
parent[find(index1)] = find(index2)
cities = len(isConnected)
parent = list(range(cities))
for i in range(cities):
for j in range(i + 1, cities):
if isConnected[i][j] == 1:
union(i, j)
provinces = sum(parent[i] == i for i in range(cities))
return provinces
正则表达式匹配
import re
class Solution(object):
def isMatch(self, s, p):
return re.match(p+'$',s)
末尾需加上‘$’,不然会出现下面的情况