ps:teflib:disjointset
disjointset.py
imports and globals
from typing import TypeVar
T = TypeVar('T')
DisjointSet
코드
# N DisjointSet
# I {"version": "2.0"}
class DisjointSet:
"""Disjoint Set for integers with path compression and union-by-size."""
def __init__(self, size: int):
self._parent = [-1] * size
def union(self, x: int, y: int, should_raise: bool = False) -> int:
root_x, root_y = self.find(x), self.find(y)
if root_x == root_y:
if should_raise:
raise ValueError(f'{x} and {y} are already in the same set.')
else:
return root_x
if self._parent[root_x] > self._parent[root_y]:
root_x, root_y = root_y, root_x
self._parent[root_x] += self._parent[root_y]
self._parent[root_y] = root_x
return root_x
def find(self, x: int) -> int:
while (p := self._parent[x]) >= 0:
x, self._parent[x] = p, self._parent[p]
return x
설명
- Disjoint Set 참고
이 코드를 사용하는 문제
출처 | 문제 번호 | Page | 레벨 |
---|---|---|---|
BOJ | 13899 | Coordinates | 골드 5 |
BOJ | 15459 | Haybale Feast | 골드 1 |
BOJ | 10775 | 공항 | 골드 2 |
BOJ | 11085 | 군사 이동 | 골드 3 |
BOJ | 2927 | 남극 탐험 | 다이아몬드 5 |
BOJ | 23040 | 누텔라 트리 (Easy) | 골드 3 |
BOJ | 4792 | 레드 블루 스패닝 트리 | 플래티넘 3 |
BOJ | 9938 | 방 청소 | 플래티넘 3 |
BOJ | 20040 | 사이클 게임 | 골드 4 |
BOJ | 1976 | 여행 가자 | 골드 4 |
BOJ | 23818 | 원수의 원수 | 골드 1 |
BOJ | 12893 | 적의 적 | 골드 4 |
BOJ | 1717 | 집합의 표현 | 골드 4 |
BOJ | 10868 | 최솟값 | 골드 1 |
BOJ | 4195 | 친구 네트워크 | 골드 2 |
BOJ | 13306 | 트리 | 플래티넘 5 |
BOJ | 16724 | 피리 부는 사나이 | 골드 2 |
ps/teflib/disjointset.txt · 마지막으로 수정됨: 2022/11/11 16:01 저자 teferi
토론