public void Constructor()
        {
            var graph     = new UndirectedGraph <int, Edge <int> >();
            var algorithm = new KruskalMinimumSpanningTreeAlgorithm <int, Edge <int> >(graph, edge => 1.0);

            AssertAlgorithmState(algorithm, graph);

            algorithm = new KruskalMinimumSpanningTreeAlgorithm <int, Edge <int> >(null, graph, edge => 1.0);
            AssertAlgorithmState(algorithm, graph);
        }
        public void Kruskal<TVertex,TEdge>([PexAssumeNotNull]IUndirectedGraph<TVertex, TEdge> g)
            where TEdge : IEdge<TVertex>
        {
            var distances = new Dictionary<TEdge, double>();
            foreach(var e in g.Edges)
                distances[e] = g.AdjacentDegree(e.Source) + 1;

            var kruskal = new KruskalMinimumSpanningTreeAlgorithm<TVertex, TEdge>(g, e => distances[e]);
            AssertMinimumSpanningTree<TVertex, TEdge>(g, kruskal);
        }
Example #3
0
        public static IEnumerable <TaggedEdge <string, string> > GetEdges(UndirectedGraph <string, TaggedEdge <string, string> > g)
        {
            var algorithm = new KruskalMinimumSpanningTreeAlgorithm <string, TaggedEdge <string, string> >(g, edgeWeights => double.Parse(edgeWeights.Tag));
            var recorder  = new EdgeRecorderObserver <string, TaggedEdge <string, string> >();

            using (recorder.Attach(algorithm))
            {
                algorithm.Compute();
                return(recorder.Edges);
            }
        }
Example #4
0
        public static IEnumerable <Edge <int> > GetEdges(UndirectedGraph <int, Edge <int> > g)
        {
            var algorithm = new KruskalMinimumSpanningTreeAlgorithm <int, Edge <int> >(g, edgeWeights => 1.0);
            var recorder  = new EdgeRecorderObserver <int, Edge <int> >();

            using (recorder.Attach(algorithm))
            {
                algorithm.Compute();
                return(recorder.Edges);
            }
        }
        protected static void KruskalSpanningTree <TVertex, TEdge>(IUndirectedGraph <TVertex, TEdge> graph, Func <TEdge, double> edgeWeights)
            where TEdge : IEdge <TVertex>
        {
            var distances = new Dictionary <TEdge, double>();

            foreach (TEdge edge in graph.Edges)
            {
                distances[edge] = edgeWeights(edge);
            }

            var kruskal = new KruskalMinimumSpanningTreeAlgorithm <TVertex, TEdge>(graph, e => distances[e]);

            AssertMinimumSpanningTree(graph, kruskal);
        }
Example #6
0
        /// <summary>
        /// Kruskal Minimum Spanning Tree
        /// </summary>
        /// <typeparam name="TVertex"></typeparam>
        /// <typeparam name="TEdge"></typeparam>
        /// <param name="g"></param>
        /// <param name="edgeWeights"></param>
        /// <param name="resultEdges"></param>
        private static void Kruskal <TVertex, TEdge>(IUndirectedGraph <TVertex, TEdge> g, Func <TEdge, double> edgeWeights, ref int[][] resultEdges) where TEdge : IEdge <TVertex>
        {
            var ed        = g.Edges.ToList();
            var distances = new Dictionary <TEdge, double>();

            foreach (var e in g.Edges)
            {
                distances[e] = edgeWeights(e);
            }

            var prim = new KruskalMinimumSpanningTreeAlgorithm <TVertex, TEdge>(g, e => distances[e]);

            AssertMinimumSpanningTree <TVertex, TEdge>(g, prim, ref resultEdges);
        }
        private static void Kruskal <TVertex, TEdge>([NotNull] IUndirectedGraph <TVertex, TEdge> graph)
            where TEdge : IEdge <TVertex>
        {
            var distances = new Dictionary <TEdge, double>();

            foreach (TEdge edge in graph.Edges)
            {
                distances[edge] = graph.AdjacentDegree(edge.Source) + 1;
            }

            var kruskal = new KruskalMinimumSpanningTreeAlgorithm <TVertex, TEdge>(graph, e => distances[e]);

            AssertMinimumSpanningTree(graph, kruskal);
        }
        public void MyKruskal <TVertex, TEdge>([PexAssumeNotNull] IUndirectedGraph <TVertex, TEdge> g, Func <TEdge, double> edgeWeights)
            where TEdge : IEdge <TVertex>
        {
            var ed        = g.Edges.ToList();
            var distances = new Dictionary <TEdge, double>();

            foreach (var e in g.Edges)
            {
                distances[e] = edgeWeights(e);
            }

            var prim = new KruskalMinimumSpanningTreeAlgorithm <TVertex, TEdge>(g, e => distances[e]);

            AssertMinimumSpanningTree <TVertex, TEdge>(g, prim);
        }
Example #9
0
        public static double GetCost(UndirectedGraph <string, TaggedEdge <string, string> > g)
        {
            var algorithm = new KruskalMinimumSpanningTreeAlgorithm <string, TaggedEdge <string, string> >(g, edgeWeights => double.Parse(edgeWeights.Tag));
            var recorder  = new EdgeRecorderObserver <string, TaggedEdge <string, string> >();

            var distances = new Dictionary <TaggedEdge <string, string>, double>();

            foreach (var e in g.Edges)
            {
                distances[e] = double.Parse(e.Tag);
            }

            using (recorder.Attach(algorithm))
            {
                algorithm.Compute();
                return(recorder.Edges.Sum(e => distances[e]));
            }
        }
Example #10
0
        public static double GetCost(UndirectedGraph <int, Edge <int> > g)
        {
            var algorithm = new KruskalMinimumSpanningTreeAlgorithm <int, Edge <int> >(g, edgeWeights => 1.0);
            var recorder  = new EdgeRecorderObserver <int, Edge <int> >();

            var distances = new Dictionary <Edge <int>, double>();

            foreach (var edge in g.Edges)
            {
                distances[edge] = 1.0;
            }

            using (recorder.Attach(algorithm))
            {
                algorithm.Compute();
                return(recorder.Edges.Sum(e => distances[e]));
            }
        }
        /// <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>
            (this 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);
        }