using System.Collections.Generic;
public int P {get; private set;}
public int Q {get; private set;}
public Union(int p, int q){
public class QuickUnion {
private List<int> _storage;
public QuickUnion(int capacity){
_storage = new List<int>(capacity);
for(int i = 0; i< capacity; i++){
public bool Connected(int p, int q){
return Root(p) == Root(q);
public void Union(int p, int q){
Console.WriteLine("Already Connected");
_storage[rootOfP] = rootOfQ;
public static void Main() {
var unions = new List<Union> {
var quickFinder = new QuickUnion(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);