FindMinimumSpanningTree(WeightedGraph <T, TW> graph)
        {
            var edges = new List <MSTEdge <T, TW> >();


            //gather all unique edges
            dfs(graph.ReferenceVertex, new System.Collections.Generic.HashSet <T>(),
                new Dictionary <T, System.Collections.Generic.HashSet <T> >(),
                edges);

            //quick sort preparation
            var sortArray = new MSTEdge <T, TW> [edges.Count];

            for (int i = 0; i < edges.Count; i++)
            {
                sortArray[i] = edges[i];
            }

            //quick sort edges
            var sortedEdges = MergeSort <MSTEdge <T, TW> > .Sort(sortArray);

            var result      = new List <MSTEdge <T, TW> >();
            var disJointSet = new DisJointSet <T>();

            //create set
            foreach (var vertex in graph.Vertices)
            {
                disJointSet.MakeSet(vertex.Key);
            }


            //pick each edge one by one
            //if both source & target belongs to same set
            //then don't add the edge to result
            //otherwise add it to result and union sets
            for (int i = 0; i < edges.Count; i++)
            {
                var currentEdge = sortedEdges[i];

                var setA = disJointSet.FindSet(currentEdge.Source);
                var setB = disJointSet.FindSet(currentEdge.Destination);

                //can't pick edge with both ends already in MST
                if (setA.Equals(setB))
                {
                    continue;
                }

                result.Add(currentEdge);

                //union picked edge vertice sets
                disJointSet.Union(setA, setB);
            }

            return(result);
        }
 public int CompareTo(MSTEdge <T, W> other)
 {
     return(Weight.CompareTo(other.Weight));
 }