public (int x, int y) GetRoot((int x, int y) key)
{
if (!parents.TryGetValue(key, out var parent))
parents[key] = key;
if (!parent.Equals(key))
parents[key] = GetRoot(parents[key]);
return parents[key];
}
public bool IsUnioned((int x, int y) k1, (int x, int y) k2) => GetRoot(k1).Equals(GetRoot(k2));
public void Union((int x, int y) k1, (int x, int y) k2)
{
var root1 = GetRoot(k1);
var root2 = GetRoot(k2);
if (!IsUnioned(root1, root2))
parents[root2] = root1;
}