public City FindIntermediateCity(GraphVertex startVertex, GraphVertex finishVertex) { GraphVertexInfo temp = null; if (startVertex == null || startVertex.number > infos.Length - 1) { return(null); } GraphVertexInfo first = infos[startVertex.number]; if (first != null && finishVertex != null) { first.EdgesWeightSum = 0; while (true) { GraphVertexInfo current = FindUnvisitedVertexWithMinSum(temp); if (current == null) { break; } SetSumToNextVertex(current); } return(GetNextCity(startVertex, finishVertex)); } else { return(null); } }
City GetNextCity(GraphVertex startVertex, GraphVertex endVertex) { var path = new List <City>(); path.Add(endVertex.City); while (startVertex != endVertex) { if (endVertex.number > infos.Length - 1) { GraphVertexInfo temp = GetVertexInfo(endVertex); if (temp != null) { GraphVertex vert = temp.Vertex; endVertex = temp.PreviousVertex; path.Add(endVertex.City); } else { return(null); } } else { endVertex = infos[endVertex.number].PreviousVertex; if (endVertex == null) { return(null); } path.Add(endVertex.City); } } return(path[path.Count - 2]); }
public void InitInfo() { infos = new GraphVertexInfo[graph.Vertices.Count]; for (int i = 0; i < graph.Vertices.Count; i++) { infos[i] = new GraphVertexInfo(graph.Vertices[i], i); } }
private void SetSumToNextVertex(GraphVertexInfo Info) { Info.IsUnvisited = false; foreach (var e in Info.Vertex.Edges) { var nextInfo = GetVertexInfo(e.ConnectedVertex); var sum = Info.EdgeWeightSum + e.Weight; if (sum < nextInfo.EdgeWeightSum) { nextInfo.EdgeWeightSum = sum; nextInfo.PreviousVertex = Info.Vertex; } } }
void SetSumToNextVertex(GraphVertexInfo info) { info.IsUnvisited = false; foreach (var e in GetAllEdges(info.Vertex.Name)) { var nextInfo = GetVertexInfo(e.To); var sum = info.EdgesWeightSum + e.Lenght; if (sum < nextInfo.EdgesWeightSum) { nextInfo.EdgesWeightSum = sum; nextInfo.PreviousVertex = info.Vertex; } } }
private GraphVertexInfo FindUnvisitedVertexWithMinSum() { var minValue = int.MaxValue; GraphVertexInfo minVertexInfo = null; foreach (var i in infos) { if (i.IsUnvisited && i.EdgeWeightSum < minValue) { minVertexInfo = i; minValue = i.EdgeWeightSum; } } return(minVertexInfo); }
public GraphVertexInfo FindUnvisitedVertexWithMinSum(GraphVertexInfo graph) { var minValue = int.MaxValue; GraphVertexInfo minVertexInfo = null; for (int i = 0; i < infos.Length; i++) { if (infos[i].IsUnvisited && infos[i].EdgesWeightSum < minValue) { minVertexInfo = infos[i]; minValue = infos[i].EdgesWeightSum; break; } } return(minVertexInfo); }
/// <summary> /// Вычисление суммы весов ребер для следующей вершины /// </summary> /// <param name="info">Информация о текущей вершине</param> void SetSumToNextVertex(GraphVertexInfo info) { info.IsUnvisited = false; foreach (var e in info.Vertex.Edges) { var nextInfo = GetVertexInfo(e.ConnectedVertex); var sum = info.EdgesWeightSum + e.EdgeWeight; if (sum < nextInfo.EdgesWeightSum) { nextInfo.EdgesWeightSum = sum; nextInfo.PreviousVertex = info.Vertex; //===== nextInfo.weight = e.EdgeWeight; nextInfo.train = e.Train; } } }
void SetSumToNextVertex(GraphVertexInfo info) { GraphVertexInfo nextInfo; int sum; info.IsUnvisited = false; foreach (var e in info.Vertex.Edges) { nextInfo = infos[e.ConnectedVertex.number]; sum = info.EdgesWeightSum + e.EdgeWeight; if (sum < nextInfo.EdgesWeightSum) { nextInfo.EdgesWeightSum = sum; nextInfo.PreviousVertex = info.Vertex; } } }