-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSingleSourceShortestPathComputer.java
More file actions
124 lines (115 loc) · 4.93 KB
/
SingleSourceShortestPathComputer.java
File metadata and controls
124 lines (115 loc) · 4.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package it.unicam.cs.asdl2122.pt1;
import java.util.List;
/**
* Questa interface definisce oggetti che sono calcolatori di cammini minimi con
* sorgente singola su un certo grafo orientato e pesato dato. Il grafo su cui
* lavorare deve essere passato quando l'oggetto calcolatore viene costruito.
*
* @author Luca Tesei
*
* @param <L>
* il tipo delle etichette dei nodi del grafo
*/
public interface SingleSourceShortestPathComputer<L> {
/**
* Inizializza le informazioni necessarie associate ai nodi del grafo
* associato a questo calcolatore ed esegue un algoritmo per il calcolo dei
* cammini minimi a partire da una sorgente data.
*
* @param sourceNode
* il nodo sorgente da cui calcolare i cammini minimi
* verso tutti gli altri nodi del grafo
* @throws NullPointerException
* se il nodo passato è nullo
*
* @throws IllegalArgumentException
* se il nodo passato non esiste nel
* grafo associato a questo calcolatore
* @throws IllegalStateException
* se il calcolo non può essere
* effettuato per via dei valori dei
* pesi del grafo, ad esempio se il
* grafo contiene cicli di peso
* negativo.
*/
public void computeShortestPathsFrom(GraphNode<L> sourceNode);
/**
* Determina se è stata invocata almeno una volta la procedura di calcolo
* dei cammini minimi a partire da un certo nodo sorgente specificato.
*
* @return true, se i cammini minimi da un certo nodo sorgente sono stati
* calcolati almeno una volta da questo calcolatore
*/
public boolean isComputed();
/**
* Restituisce il nodo sorgente specificato nell'ultima chiamata effettuata
* a {@code computeShortestPathsFrom(GraphNode<V>)}.
*
* @return il nodo sorgente specificato nell'ultimo calcolo dei cammini
* minimi effettuato
*
* @throws IllegalStateException
* se non è stato eseguito nemmeno una
* volta il calcolo dei cammini minimi a
* partire da un nodo sorgente
*/
public GraphNode<L> getLastSource();
/**
* Restituisce il grafo su cui opera questo calcolatore.
*
* @return il grafo su cui opera questo calcolatore
*/
public Graph<L> getGraph();
/**
* Restituisce una lista di archi dal nodo sorgente dell'ultimo calcolo di
* cammini minimi al nodo passato. Tale lista corrisponde a un cammino
* minimo tra il nodo sorgente e il nodo target passato.
*
* @param targetNode
* il nodo verso cui restituire il cammino minimo
* dalla sorgente
* @return La lista di archi corrispondente al cammino minimo; la lista è
* vuota se il nodo passato è il nodo sorgente. Viene restituito
* {@code null} se il nodo passato non è raggiungibile dalla
* sorgente
*
* @throws NullPointerException
* se il nodo passato è nullo
*
* @throws IllegalArgumentException
* se il nodo passato non esiste
*
* @throws IllegalStateException
* se non è stato eseguito nemmeno una
* volta il calcolo dei cammini minimi
* a partire da un nodo sorgente
*
*/
public List<GraphEdge<L>> getShortestPathTo(GraphNode<L> targetNode);
/**
* Genera una stringa di descrizione di un path riportando i nodi
* attraversati e i pesi degli archi. Nel caso di cammino vuoto genera solo
* la stringa {@code "[ ]"}.
*
* @param path
* un cammino minimo
* @return una stringa di descrizione del cammino minimo
* @throws NullPointerException
* se il cammino passato è nullo
*/
default public String printPath(List<GraphEdge<L>> path) {
if (path == null)
throw new NullPointerException(
"Richiesta di stampare un path nullo");
if (path.isEmpty())
return "[ ]";
// Costruisco la stringa
StringBuffer s = new StringBuffer();
s.append("[ " + path.get(0).getNode1().toString());
for (int i = 0; i < path.size(); i++)
s.append(" -- " + path.get(i).getWeight() + " --> "
+ path.get(i).getNode2().toString());
s.append(" ]");
return s.toString();
}
}