import java.util.*;
import sk.upjs.paz.graph.*;
public class Grafy {
// Relaxacia orientovanej hrany
public static void relax(Edge e, Map<Vertex, Double> d) {
Vertex u = e.getSource();
Vertex v = e.getTarget();
if (d.get(u) + e.getWeight() < d.get(v))
d.put(v, d.get(u) + e.getWeight());
}
// Dijkstrov algoritmus
public static Map<Vertex, Double> dijkstra(Graph g, Vertex s) {
// Iba orientovane grafy su akceptovane ako vstup
if (!g.isDirected())
throw new RuntimeException(
"Len orientovane grafy su akceptovane pre Dijkstrov algoritmus");
// Vytvorime map, v ktorom budeme pre kazdy vrchol udrziavat aktualny
// horny odhad dlzky najkratsej cesty z s do tohto vrcholu
Map<Vertex, Double> d = new HashMap<Vertex, Double>();
// Inicializacia predbeznych najkratsich vzdialenosti
for (Vertex v : g.getVertices())
d.put(v, Double.POSITIVE_INFINITY);
d.put(s, 0d);
Set<Vertex> nevybavene = new HashSet<Vertex>(g.getVertices());
while (!nevybavene.isEmpty()) {
// Vyberieme vrchol, ktory spomedzi nevybavenych ma najmensi
// medzivysledok d
Vertex vybrany = nevybavene.iterator().next();
for (Vertex v : nevybavene)
if (d.get(v) < d.get(vybrany))
vybrany = v;
// Nechame zrelaxovat vsetky z neho vychadzajuce hrany
for (Edge e : vybrany.getOutEdges())
relax(e, d);
// Vybrany vrchol vyberieme z mnoziny nevybavenych
nevybavene.remove(vybrany);
}
return d;
}
public static void main(String[] args) {
Graph mapa = new Graph();
mapa.loadFromFile("graf.txt");
mapa.setDirected(true);
System.out.println(mapa);
System.out.println(dijkstra(mapa, mapa.getVertex("A")));
}
}