Example #1
0
        //Алгоритм Прима
        #region Prim()
        public Graph Prim()
        {
            Graph graph = new Graph(this);

            List <string> all_vertex = graph.GetListVertex();
            Random        rnd        = new Random();

            string random_vertex        = all_vertex[rnd.Next(all_vertex.Count)];
            Graph  minimum_weight_frame = new Graph();

            minimum_weight_frame.AddVertex(random_vertex);
            all_vertex.Remove(random_vertex);

            while (all_vertex.Count > 0)
            {
                List <Edge>   adjacent          = new List <Edge>();
                List <string> proccessed_vertex = minimum_weight_frame.GetListVertex();

                foreach (string vertex in proccessed_vertex)
                {
                    foreach (KeyValuePair <string, double?> edge in graph.GetListWeightedEdges(vertex))
                    {
                        adjacent.Add(new Edge(vertex, edge.Key, edge.Value));
                    }
                }

                //Находим минимальные ребра
                var min_weight   = adjacent.Min(elem => elem.Weight);
                var all_min_elem =
                    adjacent.Where(elem => elem.Weight == min_weight).ToList();

                int random_index = rnd.Next(all_min_elem.Count);
                graph.RemoveOrientedEdge(
                    all_min_elem[random_index].VertexFrom,
                    all_min_elem[random_index].VertexTo
                    );

                minimum_weight_frame.AddVertex(all_min_elem[random_index].VertexTo);
                all_vertex.Remove(all_min_elem[random_index].VertexTo);

                minimum_weight_frame.AddOrientedEdge(
                    all_min_elem[random_index].VertexFrom,
                    all_min_elem[random_index].VertexTo,
                    all_min_elem[random_index].Weight
                    );
            }
            return(minimum_weight_frame);
        }