package com.interview.algorithms.graph;
import com.interview.basics.model.graph.generic.weighted.Edge;
import com.interview.basics.model.graph.generic.weighted.Graph;
import com.interview.basics.model.graph.generic.weighted.Vertex;
import java.util.*;
/**
* http://baike.baidu.com/view/349189.htm
* Created_By: zouzhile
* Date: 4/17/14
* Time: 9:19 PM
*/
public class C6_5_ShortestPath_Dijkstra {
public int Dijkstra(Graph graph, Vertex source, Vertex target) {
Iterator<Vertex> vertexIterator = graph.vertexes();
HashMap<Vertex, Integer> pendings = new HashMap<Vertex, Integer>();
while(vertexIterator.hasNext()) {
Vertex curr = vertexIterator.next();
pendings.put(curr, Integer.MAX_VALUE);
}
pendings.put(source, 0);
Set<Vertex> visited = new HashSet<Vertex>();
while(! pendings.isEmpty()) {
Vertex current = this.nearestPendingVertex(pendings);
int nearestDistance = pendings.get(current);
if(current.equals(target))
return nearestDistance;
List<Edge> edges = graph.getEdges(current);
Iterator<Edge> edgeIterator = edges.iterator();
while(edgeIterator.hasNext()) {
Edge edge = edgeIterator.next();
int weight = edge.getWeight();
Vertex currTarget = edge.getTarget();
if(pendings.get(currTarget) == null || pendings.get(currTarget) > nearestDistance + weight)
pendings.put(currTarget, nearestDistance + weight);
}
pendings.remove(current);
visited.add(current);
}
return Integer.MAX_VALUE;
}
private Vertex nearestPendingVertex(HashMap<Vertex, Integer> pendings) {
Vertex nearestVertex = null;
for(Vertex vertex : pendings.keySet()) {
if(nearestVertex == null) {
nearestVertex = vertex;
} else {
int distance = pendings.get(vertex);
int nearestDistance = pendings.get(nearestVertex);
if(distance < nearestDistance)
nearestVertex = vertex;
}
}
return nearestVertex;
}
}