-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGraphNode.java
More file actions
242 lines (213 loc) · 5.91 KB
/
GraphNode.java
File metadata and controls
242 lines (213 loc) · 5.91 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/**
*
*/
package it.unicam.cs.asdl2122.pt1;
/**
* Questa classe raggruppa le operazioni tipicamente associate a un nodo facente
* parte di un grafo. I nodi del grafo sono etichettati con oggetti della classe
* {@code L}. L'etichetta non puà essere null. Le classi {@code GraphEdge<L>} e
* {@code Graph<L>} definiscono le operazioni tipiche sugli archi e sul grafo,
* rispettivamente.
*
* Le operazioni presenti sono quelle che sono usate dagli algoritmi su grafi
* più comuni: attribuzione e modifica di un colore, di una distanza, di un
* puntatore a un nodo predecessore e di tempi d'ingresso/uscita durante una
* visita. L'etichetta è immutabile, le altre informazioni possono cambiare e
* non definiscono l'identità del nodo, che è data esclusivamente
* dall'etichetta. In altre parole, due nodi sono uguali se e solo se hanno
* etichetta uguale.
*
* @author Luca Tesei
*
* @param <L>
* tipo delle etichette dei nodi del grafo
*
*/
public class GraphNode<L> {
/**
* Colore bianco associato al nodo.
*/
public static int COLOR_WHITE = 0;
/**
* Colore grigio associato al nodo.
*/
public static int COLOR_GREY = 1;
/**
* Colore nero associato al nodo.
*/
public static int COLOR_BLACK = 2;
private final L label;
private int color;
private double floatingPointDistance;
private int integerDistance;
private int enteringTime;
private int exitingTime;
private GraphNode<L> previous;
/**
* Costruisce un nodo assegnando tutti i valori associati ai valori di
* default.
*
* @param label
* l'etichetta da associare al nodo
*
* @throws NullPointerException
* se l'etichetta è null.
*/
public GraphNode(L label) {
if (label == null)
throw new NullPointerException("Etichetta nel nodo nulla");
this.label = label;
}
/**
* Restituisce l'etichetta associata al nodo che lo identifica univocamente
* nel grafo.
*
* @return the label
*/
public L getLabel() {
return this.label;
}
/**
* Restituisce il colore corrente del nodo.
*
* @return the color
*/
public int getColor() {
return this.color;
}
/**
*
* Assegna al nodo un certo colore.
*
* @param color
* the color to set
*/
public void setColor(int color) {
this.color = color;
}
/**
* Restituisce il valore corrente di una distanza intera associata al nodo.
*
* @return the distance
*/
public int getIntegerDistance() {
return this.integerDistance;
}
/**
* Assegna al nodo un valore di una distanza intera a esso associata.
*
* @param distance
* the distance to set
*/
public void setIntegerDistance(int distance) {
this.integerDistance = distance;
}
/**
* Restituisce il valore corrente di una distanza associata al nodo.
*
* @return the distance
*/
public double getFloatingPointDistance() {
return this.floatingPointDistance;
}
/**
* Assegna al nodo un valore di una distanza a esso associata.
*
* @param distance
* the distance to set
*/
public void setFloatingPointDistance(double distance) {
this.floatingPointDistance = distance;
}
/**
* Restituisce il nodo del grafo che correntemente è assegnato come
* predecessore di questo nodo. Ad esempio può essere usato da un algoritmo
* che costruisce un albero di copertura.
*
* @return the previous
*/
public GraphNode<L> getPrevious() {
return this.previous;
}
/**
*
* Assegna a questo nodo un nodo predecessore.
*
* @param previous
* the previous to set
*/
public void setPrevious(GraphNode<L> previous) {
this.previous = previous;
}
/**
* Restituisce il tempo d'ingresso in questo nodo durante una visita in
* profondità.
*
* @return il tempo d'ingresso in questo nodo durante una visita in
* profondità
*/
public int getEnteringTime() {
return this.enteringTime;
}
/**
* Assegna un tempo d'ingresso in questo nodo durante una visita in
* profondità.
*
* @param time
* il tempo d'ingresso da assegnare
*/
public void setEnteringTime(int time) {
this.enteringTime = time;
}
/**
* Restituisce il tempo di uscita da questo nodo durante una visita in
* profondità.
*
* @return il tempo di uscita da questo nodo durante una visita in
* profondità
*/
public int getExitingTime() {
return this.exitingTime;
}
/**
* Assegna un tempo di uscita da questo nodo durante una visita in
* profondità.
*
* @param time
* il tempo di uscita da assegnare
*/
public void setExitingTime(int time) {
this.exitingTime = time;
}
/*
* Basato sul hashCode dell'etichetta.
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return this.label.hashCode();
}
/*
* Basato sull'etichetta, che non può essere null.
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof GraphNode))
return false;
GraphNode<?> other = (GraphNode<?>) obj;
if (this.label.equals(other.label))
return true;
return false;
}
@Override
public String toString() {
return "Nodo[ " + label.toString() + " ]";
}
}