using System.Collections.Generic;
public int P {get; private set;}
public int Q {get; private set;}
public Union(int p, int q){
public int Size {get; set;}
public int Root {get; set;}
private List<Item> _storage;
public Items(int capacity){
_storage = new List<Item>(capacity);
for(int i = 0; i< capacity; i++){
var item = new Item { Size = 1, Root = i };
public Item this[int index]{
public class WeightedQuickUnion {
public WeightedQuickUnion(int capacity){
_items = new Items(capacity);
while(i != _items[i].Root){
public bool Connected(int p, int q){
return Root(p) == Root(q);
public void Union(int p, int q){
Console.WriteLine("Already Connected");
var sizeOfP = _items[rootOfP].Size;
var sizeOfQ = _items[rootOfQ].Size;
_items[rootOfP].Root = rootOfQ;
_items[rootOfQ].Size += sizeOfP;
_items[rootOfQ].Root = rootOfP;
_items[rootOfP].Size += sizeOfQ;
public static void Main() {
var unions = new List<Union> {
var quickFinder = new WeightedQuickUnion(n);
foreach(var union in unions){
Console.WriteLine("Connecting p:{0} to q:{1}", union.P, union.Q);
quickFinder.Union(union.P, union.Q);
foreach(var union in unions){
if(!quickFinder.Connected(union.P, union.Q)){
Console.WriteLine("Something is messed up. p:{0} should be connected to q:{1}.", union.P, union.Q);