Day 21
Date: October 16, 2022 1:16 PM
LinkedIn: https://leetcode.cn/problems/possible-bipartition/description/
Title: 可能的二分法
并查集
class Solution:
def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
# 并查集
#查
def find(x):
if p[x] != x:
p[x] = find(p[x])
return p[x]
g = defaultdict(list) # 不喜欢的人的组
for a, b in dislikes:
a, b = a-1, b-1 # 作为下标
g[a].append(b)
g[b].append(a)
p = list(range(n)) # 相当于 for i in range(n): p[i]=i
for i in range(n): # n个数
for j in g[i]: # 每个数对应的不喜欢的人
if find(i) == find(j):
return False # 有不喜欢的人与他一组
p[find(j)] = p[g[i][0]] # 将不喜欢的人合并到一个
return True
并查集常用操作模板
p = list(range(n)) # 初始化
size = [1] * n # 每个祖宗节点里对应总共有多少人
# 查询
def find(x):
if p[x] != x:
# 路径压缩
p[x] = find(p[x])
return p[x]
# 合并
def union(a, b):
pa, pb = find(a), find(b)
if pa == pb:
return
p[pa] = pb # 合并
size[pb] += size[pa] # 计数人数