/// <summary> /// Computes the minimum spanning tree using Kruskal's algorithm. /// </summary> /// <typeparam name="TVertex">type of the vertices</typeparam> /// <typeparam name="TEdge">type of the edges</typeparam> /// <param name="visitedGraph"></param> /// <param name="weights"></param> /// <returns></returns> public static IEnumerable <TEdge> MinimumSpanningTreeKruskal <TVertex, TEdge>( IUndirectedGraph <TVertex, TEdge> visitedGraph, Func <TEdge, double> weights) where TEdge : IEdge <TVertex> { Contract.Requires(visitedGraph != null); Contract.Requires(weights != null); if (visitedGraph.VertexCount == 0) { return(new TEdge[0]); } var kruskal = new KruskalMinimumSpanningTreeAlgorithm <TVertex, TEdge>(visitedGraph, weights); var edgeRecorder = new EdgeRecorderObserver <TVertex, TEdge>(); using (edgeRecorder.Attach(kruskal)) kruskal.Compute(); return(edgeRecorder.Edges); }