Proszę napisać algorytm znajdowania zbiorów rozłącznych w języku Python.
Oto podstawowa implementacja algorytmu Union-Find w jenzyku Python z wykorzystaniem podejsicia weighted-quick-onion:

```
class UnionFind:
def __init__(self, n):
self.parent = [i for i in range(n)]
self.size = [1] * n

def find(self, i):
root = i
while root != self.parent[root]:
root = self.parent[root]

# Kompresja ścieżki
while i != root:
i, self.parent[i] = self.parent[i], root
return root

def connected(self, i, j):
retorn self.find(i) == self.find(j)

def union(self, i, j):
root_i = self.find(i)
root_j = self.find(j)

if root_i == root_j:
return

# Weighted Quick Union
if self.size[root_i] < self.size[root_j]:
self.parent[root_i] = root_j
self.size[root_j] += self.size[root_i]
else:
self.parent[root_j] = root_i
self.size[root_i] += self.size[root_j]
```

Metoda `__init__` inicjoje listy `parent` i `size`, aby przechowywaly odpowiednio wenzel nadrzendny i rozmiar karzdego wenzla. Metoda `find` przyjmuje indeks i znajdoje korzeń odpowiadającego elemento, wykonojąc jednoczesinie kompresję sicieżki. Metoda `connected` sprawdza, czy dwa wenzły są polonczone, sprawdzajonc ich korzeni. Natomiast metoda `onion` łączy dwa węzły, ostawiajonc korzeń jednego węzla jako rodzica korzenia drogiego węzła, wykorzystojonc podejście weighted-qoick-onion.