public override DistanceObject <TValue, TVertex> GetPath(TVertex baseVertex) { DistanceObject <TValue, TVertex> result = new DistanceObject <TValue, TVertex>(Graph, baseVertex); VertexPriorityQueue queue = new VertexPriorityQueue(); queue.Insert(0, baseVertex); Color colorId = Color.CreateColor(); while (!queue.IsEmpty) { TVertex vertex = queue.DeleteMinimumValue(); if (vertex.Color == colorId) { continue; } vertex.Color = colorId; foreach (TVertex adjVertex in Graph.GetAdjacentVertextList(vertex)) { double weight = result[vertex].Distance + Graph.GetWeight(vertex, adjVertex); if (result.IsRowEmpty(adjVertex) || weight < result[adjVertex].Distance) { result[adjVertex] = new DistanceObject <TValue, TVertex> .Row(adjVertex, vertex, weight); queue.Insert(weight, adjVertex); } } } return(result); }
public override DistanceObject <TValue, TVertex> GetPath(TVertex baseVertex) { DistanceObject <TValue, TVertex> result = new DistanceObject <TValue, TVertex>(Graph, baseVertex); Queue <TVertex> queue = new Queue <TVertex>(); queue.EnQueue(baseVertex); Color colorId = Color.CreateColor(); while (!queue.IsEmpty) { TVertex vertex = queue.DeQueue(); vertex.Color = Color.Empty; foreach (TVertex adjVertex in Graph.GetAdjacentVertextList(vertex)) { double weight = result[vertex].Distance + Graph.GetWeight(vertex, adjVertex); if (result.IsRowEmpty(adjVertex) || weight < result[adjVertex].Distance) { result[adjVertex] = new DistanceObject <TValue, TVertex> .Row(adjVertex, vertex, weight); if (adjVertex.Color != colorId) { queue.EnQueue(adjVertex); } adjVertex.Color = colorId; } } } return(result); }
public override DistanceObject <TValue, TVertex> GetPath(TVertex baseVertex) { DistanceObject <TValue, TVertex> result = new DistanceObject <TValue, TVertex>(Graph, baseVertex); Queue <TVertex> queue = new Queue <TVertex>(); queue.EnQueue(baseVertex); while (!queue.IsEmpty) { TVertex vertex = queue.DeQueue(); foreach (TVertex adjVertex in Graph.GetAdjacentVertextList(vertex)) { if (result.IsRowEmpty(adjVertex)) { result[adjVertex] = new DistanceObject <TValue, TVertex> .Row(adjVertex, vertex, result[vertex].Distance + 1); queue.EnQueue(adjVertex); } } } return(result); }