package dijkstra;
import java.util.ArrayList;
import labyrinthe.GraphInterface;
import labyrinthe.VertexInterface;
public class Dijkstra {
public PreviousInterface dijkstra( GraphInterface g, VertexInterface r) {
ASet a = new ASet();
a.addVertex(r);
Previous previous = new Previous();
Pi pi = new Pi();
return dijkstra(g, r, a, pi, previous);
}
private PreviousInterface dijkstra( GraphInterface g, VertexInterface r, ASetInterface A, PiInterface pi, PreviousInterface previous) {
ArrayList<VertexInterface> vertexList = g.getAllVertices();
int n = vertexList.size();// n = ordre du graph
VertexInterface pivot = r;
boolean continuer = true; // Permet de sortir de la boucle lorsque pivot est null, ce qui arrive lorsqu'aucun chemin de va de D à A.
int i;
//initialisation de pi
for(i = 0 ; i < n ; i++) {
pi.setPi(vertexList.get(i), -1);
}
pi.setPi(r, 0);
i = 0;
while(i < n - 1 && continuer) {
ArrayList<VertexInterface> listNextVertex = pivot.getNext();
if(listNextVertex != null) {
for(int j = 0 ; j < listNextVertex.size() ; j++) {
VertexInterface successeurPivot = listNextVertex.get(j);
if(!A.isInA(successeurPivot)) {
if(pi.getPi(pivot) + g.getWeight(pivot, successeurPivot) < pi.getPi(successeurPivot) || pi.getPi(successeurPivot) == -1) {
pi.setPi(successeurPivot, pi.getPi(pivot) + g.getWeight(pivot, successeurPivot));
previous.setPrevious(successeurPivot, pivot);
}
}
}
} else {
System.out.println("Null !!");
}
//recherche du min de pi(y) pour y dans G\A :
int min = -1; // -1 <=> +infinity
VertexInterface minVertex = null;
for(int j = 0 ; j < n ; j++) {
VertexInterface currentVertex = vertexList.get(j);
if(!A.isInA(currentVertex)) {
if(pi.getPi(currentVertex) != -1 && (min > pi.getPi(currentVertex) || min == -1)) {
min = pi.getPi(currentVertex);
minVertex = currentVertex;
}
}
}
pivot = minVertex;
A.addVertex(pivot);
//si aucun pivot, il n'y a pas de chemin solution, on s'arrête.
continuer = (pivot != null);
i++;
}
return previous;
}
}