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