/** * Update the distance from the source to the concerned vertex. * @param vertex */ private void UpdateVertex(BaseVertex vertex, bool isSource2sink) { // 1. get the neighboring vertices ISet <BaseVertex> neighborVertexList = isSource2sink ? graph.GetAdjacentVertices(vertex) : graph.GetPrecedentVertices(vertex); // 2. update the distance passing on current vertex foreach (BaseVertex curAdjacentVertex in neighborVertexList) { // 2.1 skip if visited before if (determinedVertexSet.Contains(curAdjacentVertex)) { continue; } // 2.2 calculate the new distance double distance = startVertexDistanceIndex.ContainsKey(vertex)? startVertexDistanceIndex[vertex] : Graph.DISCONNECTED; distance += isSource2sink ? graph.GetEdgeWeight(vertex, curAdjacentVertex) : graph.GetEdgeWeight(curAdjacentVertex, vertex); // 2.3 update the distance if necessary if (!startVertexDistanceIndex.ContainsKey(curAdjacentVertex) || startVertexDistanceIndex[curAdjacentVertex] > distance) { startVertexDistanceIndex.AddOrReplace(curAdjacentVertex, distance); predecessorIndex.AddOrReplace(curAdjacentVertex, vertex); curAdjacentVertex.SetWeight(distance); vertexCandidateQueue.add(curAdjacentVertex, curAdjacentVertex.GetWeight()); } } }