1 25 42 package org.jgrapht.alg; 43 44 import java.util.*; 45 46 import org.jgrapht.*; 47 import org.jgrapht.traverse.*; 48 49 50 58 public final class DijkstraShortestPath<V, E> 59 { 60 61 63 private List<E> edgeList; 64 private double pathLength; 65 66 68 77 public DijkstraShortestPath(Graph<V, E> graph, 78 V startVertex, 79 V endVertex) 80 { 81 this(graph, startVertex, endVertex, Double.POSITIVE_INFINITY); 82 } 83 84 95 public DijkstraShortestPath( 96 Graph<V, E> graph, 97 V startVertex, 98 V endVertex, 99 double radius) 100 { 101 ClosestFirstIterator<V, E> iter = 102 new ClosestFirstIterator<V, E>(graph, startVertex, radius); 103 104 while (iter.hasNext()) { 105 V vertex = iter.next(); 106 107 if (vertex.equals(endVertex)) { 108 createEdgeList(graph, iter, endVertex); 109 pathLength = iter.getShortestPathLength(endVertex); 110 111 return; 112 } 113 } 114 115 edgeList = null; 116 pathLength = Double.POSITIVE_INFINITY; 117 } 118 119 121 126 public List<E> getPathEdgeList() 127 { 128 return edgeList; 129 } 130 131 136 public double getPathLength() 137 { 138 return pathLength; 139 } 140 141 152 public static <V, E> List<E> findPathBetween( 153 Graph<V, E> graph, 154 V startVertex, 155 V endVertex) 156 { 157 DijkstraShortestPath<V, E> alg = 158 new DijkstraShortestPath<V, E>( 159 graph, 160 startVertex, 161 endVertex); 162 163 return alg.getPathEdgeList(); 164 } 165 166 private void createEdgeList( 167 Graph<V, E> graph, 168 ClosestFirstIterator<V, E> iter, 169 V endVertex) 170 { 171 edgeList = new ArrayList<E>(); 172 173 while (true) { 174 E edge = iter.getSpanningTreeEdge(endVertex); 175 176 if (edge == null) { 177 break; 178 } 179 180 edgeList.add(edge); 181 endVertex = Graphs.getOppositeVertex(graph, edge, endVertex); 182 } 183 184 Collections.reverse(edgeList); 185 } 186 } 187 | Popular Tags |