文章目录
- 习题
- 联盟X
- 蓝桥幼儿园
图论基础
并查集
- 并查集,总的来说,操作分为三步
初始化(每一个节点的父亲是自己),定义union(index1,index2)函数,定义find(index)函数
并查集详细内容博客
习题
联盟X
联盟X
- 典型的求解
连通分支的题目
,这个题目求解的最小连通分支 - 我们采用
并查集
进行求解
import os
import sys
from collections import defaultdict
# 请在此输入您的代码
# 并查集的问题
n, m = map(int, input().split())
# 记录父亲节点
parent = list(range(n + 1))
def find(index1):
if parent[index1] != index1:
parent[index1] = find(parent[index1])
return parent[index1]
def union(index1, index2):
# parent[index1] = find(parent[index2])
parent[find(index1)] = find(index2)
for _ in range(m):
u, v = map(int, input().split())
union(u, v)
# 根据祖先计数,也就是同一个并查集的放在一起
store = defaultdict(int)
for i in range(1, n + 1):
fa = find(i)
store[fa] += 1
print(min(store.values()))
蓝桥幼儿园
蓝桥幼儿园
- 典型的并查集模版题目
import os
import sys
# 请在此输入您的代码
# 典型的并查集问题
N,M = map(int,input().split())
parent = list(range(N+1))
def find(index):
if parent[index] != index:
parent[index] = find(parent[index])
return parent[index]
def union(index1,index2):
parent[find(index1)] = find(index2)
for _ in range(M):
op,x,y = map(int,input().split())
if op == 1:
union(x,y)
if op == 2:
if find(x)==find(y):
print("YES")
else:
print("NO")