예제 #1
0
        /**
         * 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());
                }
            }
        }