//Алгоритм Прима #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); }