public GraphVertex[] FindVertex(string[] vertexName) { int count = 0; foreach (var v in Vertices) { int index = Array.IndexOf(vertexName, v.Name); if (index > -1) { count++; } } GraphVertex[] arr = new GraphVertex[count]; count = 0; foreach (var v in Vertices) { int index = Array.IndexOf(vertexName, v.Name); if (index > -1) { arr[count] = v; count++; } } return(arr); }
/// <summary> /// Конструктор /// </summary> /// <param name="vertex">Вершина</param> public GraphVertexInfo(GraphVertex vertex) { Vertex = vertex; IsUnvisited = true; EdgesWeightSum = int.MaxValue; PreviousVertex = null; }
public string FindShortestPath(GraphVertex startVertex, GraphVertex[] finishVertex, string result, int count) { InitInfo(); var first = GetVertexInfo(startVertex); first.EdgesWeightSum = 0; int minVal = int.MaxValue; int s = 0; GraphVertexInfo v = null; while (true) { s = 0; foreach (var vert in finishVertex) { int id = result.IndexOf(vert.Name); if (id > -1) { s++; } } if (s == finishVertex.Length - 1) { break; } var current = FindUnvisitedVertexWithMinSum(); if (current == null) { if (v.IsUnvisited == false) { result += v.Vertex.Name + "(город адресат)"; v.IsUnvisited = true; } else { result += v.Vertex.Name + "(Транзитный город)"; } startVertex = v.Vertex; FindShortestPath(startVertex, finishVertex, result, 0); } else { SetSumToNextVertex(current); int index = -1; foreach (var t in finishVertex) { if (t.Name == current.Vertex.Name) { index = 0; } } if (minVal > current.EdgesWeightSum && index == 0 && current.Vertex != startVertex && current.IsUnvisited == false) { minVal = current.EdgesWeightSum; v = current; } } } return(result); }
private void button1_Click(object sender, EventArgs e) { string[] checkedCitys = GetCheckedCity(); int min = int.MaxValue; int count = 0; string result = textBox1.Text.ToUpper(); GraphVertex X = null; textBox2.Text = Program.dijkstra.FindShortestPath(textBox1.Text.ToUpper(), checkedCitys, result, count); }
/// <summary> /// Получение информации о вершине графа /// </summary> /// <param name="v">Вершина</param> /// <returns>Информация о вершине</returns> public GraphVertexInfo GetVertexInfo(GraphVertex v) { foreach (var i in infos) { if (i.Vertex.Equals(v)) { return(i); } } return(null); }
/// <summary> /// Формирование пути /// </summary> /// <param name="startVertex">Начальная вершина</param> /// <param name="endVertex">Конечная вершина</param> /// <returns>Путь</returns> string GetPath(GraphVertex startVertex, GraphVertex endVertex) { var path = endVertex.ToString(); while (startVertex != endVertex) { endVertex = GetVertexInfo(endVertex).PreviousVertex; path = endVertex.ToString() + path; } return(path); }
/// <summary> /// Поиск кратчайшего пути по вершинам /// </summary> /// <param name="startVertex">Стартовая вершина</param> /// <param name="finishVertex">Финишная вершина</param> /// <returns>Кратчайший путь</returns> public string FindShortestPath(GraphVertex startVertex, GraphVertex finishVertex) { InitInfo(); var first = GetVertexInfo(startVertex); first.EdgesWeightSum = 0; while (true) { var current = FindUnvisitedVertexWithMinSum(); if (current == null) { break; } SetSumToNextVertex(current); } return(GetPath(startVertex, finishVertex)); }
/// <summary> /// Конструктор /// </summary> /// <param name="connectedVertex">Связанная вершина</param> /// <param name="weight">Вес ребра</param> public GraphEdge(GraphVertex connectedVertex, int weight) { ConnectedVertex = connectedVertex; EdgeWeight = weight; }
/// <summary> /// Добавить ребро /// </summary> /// <param name="vertex">Вершина</param> /// <param name="edgeWeight">Вес</param> public void AddEdge(GraphVertex vertex, int edgeWeight) { AddEdge(new GraphEdge(vertex, edgeWeight)); }