-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNode.java
473 lines (315 loc) · 7.91 KB
/
Node.java
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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
/**
* Classe che rappresenta un nodo di un grafo orientato.
*
* @author Rosa Marco
* @since 2016-09-24
*/
public class Node{
private String datum; //Il dato contenuto nel nodo
public Node son; //Nodo successivo, cioè una "lista" di nodi
private int edges; //Numero di figli del nodo
private int parent; //Indice del nodo genitore
/*
* Valori booleani che indicano di quale colore (true) è il nodo
*/
private boolean WHITE;
private boolean GRAY;
private boolean BLACK;
/*
* Discovery time e finish time del nodo
*/
private int Dtime;
private int Ftime;
public boolean newEdge; //Flag per capire se il nodo possiede un arco aggiunto
public String parentInTree; //Dato appartenente al padre nell'albero minimo
private int distance; //Distanza del nodo dalla radice
private boolean scc; //Campo booleano che indica se il nodo appartiene ad una componente fortemente connessa
private int indexInAdj; //Indice del nodo nella lista adj di un grafo
/**
* Costruttore di Nodo che crea un nodo a partire da un dato. Il nodo successivo viene posto a null e
* vengono istanziate le altre variabili.
*
* @param datum: il dato contenuto nel nodo
*/
public Node(String datum){
this.datum = datum;
this.son = null;
this.WHITE = true;
this.GRAY = false;
this.BLACK = false;
this.edges = 0;
this.Dtime = 0;
this.Ftime = 0;
this.newEdge = false;
this.distance = 0;
this.parent = -1;
this.scc = false;
this.indexInAdj = -1;
this.parentInTree = "";
}
/**
* Setta l'indice che il nodo possiede nella lista adj di un grafo
*
* @param indexInAdj: l'indice del nodo nella lista adj
*/
public void setIndexInAdj(int indexInAdj){
this.indexInAdj = indexInAdj;
}
/**
* Restitiusce l'indice del nodo nella lista adj di un grafo
*
* @return l'indice del nodo nella lista adj
*/
public int getIndexInAdj(){
return this.indexInAdj;
}
/**
* Metodo che restituisce il dato del nodo.
*
* @return il dato del nodo
*/
public String getDatum(){
return datum;
}
/**
* Metodo che compara due nodi (il chiamante e quello come argomento). Se i due nodi hanno
* lo stesso dato, allora sono lo stesso nodo e viene restituito true, false altrimenti.
*
* @param v: il nodo con cui comparare il nodo chiamante
* @return true se i nodi sono uguali, false altrimenti
*/
public boolean equals(Node v){
if(datum.equals(v.getDatum())){
return true;
}
return false;
}
/**
* Metodo che permette la ricerca nella struttura dati del nodo v. Se è presente restituisce true,
* false altrimenti.
*
* @param v: il nodo da cercare
* @return true se il nodo viene trovato, false altrimenti
*/
public boolean findNode(Node v){
if(son == null){
return false;
}
Node temp = son;
while(temp != null){
if(temp.equals(v)){
return true;
}
temp = temp.son;
}
return false;
}
/**
* Metodo che restituisce il numero di nodi figli del nodo chiamante.
*
* @return il numero di archi uscenti del nodo
*/
public int getEdges(){
return edges;
}
/**
* Metodo che permette l'aggiunta di un nodo. Il metodo verifica se ci sono già nodi o meno.
* Se non ce ne sono il nodo "v" viene aggiunto, se invece "son" non è null, allora
* il nuovo nodo "v" viene aggiunto in prima posizione e "v" punta al nodo che precedentemente
* era in son.
*
* @param v: il nodo da aggiungere alla lista di adiancenza
*/
public void addEdge(Node v){
if(son == null){
son = v;
} else {
Node temp = son;
son = v;
son.son = temp;
}
edges++;
}
/**
* Metodo per settare il colore di un nodo. I possibili input sono w = bianco, g = grigio
* e b = nero. Se vengono inseriti altri caratteri il colore non viene modificato.
*
* @param s: il carattere che indica di che colore colorare il nodo (w = white, g = gray, b = black)
*/
public void setColor(char s){
if(s != 'w' && s != 'g' && s != 'b'){
return;
}
WHITE = (s == 'w' ? true : false);
GRAY = (s == 'g' ? true : false);
BLACK = (s == 'b' ? true : false);
}
/**
* Restituisce true se il nodo è bianco
*
* @return true se il nodo è bianco, false altrimenti
*/
public boolean isWhite(){
return WHITE;
}
/**
* Restituisce true se il nodo è grigio
*
* @return true se il nodo è grigio, false altrimenti
*/
public boolean isGray(){
return GRAY;
}
/**
* Restituisce true se il nodo è nero
*
* @return true se il nodo è nero, false altrimenti
*/
public boolean isBlack(){
return BLACK;
}
/**
* Prende tutti i figli del nodo chiamante e li restituisce in un array di nodi.
*
* @return la lista di adiacenza in formato array di nodi
*/
public Node getAdj(){
return son;
}
/**
* Setta la variabile discovery time al valore "Dtime" passato come argomento
*
* @param Dtime: il tempo di scoperta
*/
public void setDiscovery(int Dtime){
if(this.Dtime == 0){
this.Dtime = Dtime;
}
}
/**
* Setta la variabile finish time al valore "Ftime" passato come argomento
*
* @param Ftime: il tempo di fine
*/
public void setFinish(int Ftime){
if(this.Ftime == 0){
this.Ftime = Ftime;
}
}
/**
* Restituisce il tempo di fine visita
*
* @return il tempo di fine visita
*/
public int getFinish(){
return Ftime;
}
/**
* Setta a 0 Dtime e Ftime
*/
public void resetTime(){
this.Dtime = 0;
this.Ftime = 0;
}
/**
* Setta la distanza del nodo dalla radice.
*
* @param n: la distanza dalla radice
*/
public void setDistance(int n){
this.distance = n;
}
/**
* Restituisce la distanza del nodo dalla radice.
*
* @return la distanza dalla radice
*/
public int getDistance(){
return distance;
}
/**
* Setta a true il flag "newEdge" del nodo, segnalando la presenza di un arco aggiunto.
*/
public void setNewEdge(){
this.newEdge = true;
}
/**
* Setta la variabile parent che rappresenta l'indice, nel grafo, del genitore
*
* @param p: indice della lista adj del nodo padre
*/
public void setParent(int p){
this.parent = p;
}
/**
* Restituisce l'indice del genitore. Se vale -1 il nodo non ha un genitore
*
* @return l'indice nella lista adj del nodo padre. Vale -1 se non ci sono genitori
*/
public int getParent(){
return parent;
}
/**
* Metodo toString che permette di ottenere una visualizzazione di un nodo e dei nodi a cui punta.
* Il tutto viene restituito in sintassi dot.
*
* @return la rappresentazione in .dot del nodo e della sua lista di adiacenza
*/
public String toString(){
String s = "";
//Se son è null, vuol dire che il nodo non punta a nessuno e quindi non ha archi
if(son == null){
return "";
}
Node temp = son;
String line, color, style;
while(temp != null){
color = " ["+(temp.newEdge ? "color=red, " : "");
style = (datum.equals(temp.belongsTree()) ? "style=dashed" : "")+"];\n";
line = color+style;
s += datum+"->"+temp.datum+line;
temp = temp.son;
}
return s;
}
/**
* Cerca il nodo v del nodo chiamante e imposta il suo 'parentInTree' uguale a p
*
* @param v: il nodo da cercare tra i figli del nodo chiamante
* @param p: il dato contenuto nel nodo chiamante
*/
public void addToTree(String p, Node v){
if(son == null){
return;
}
Node temp = son;
while(temp != null){
if(temp.equals(v)){
temp.parentInTree = p;
}
temp = temp.son;
}
}
/**
* Restituisce il valore di 'parentInTree'
*
* @return il valore di 'parentInTree'
*/
public String belongsTree(){
return parentInTree;
}
/**
* Setta a true il valore boolean StronglyConnectedComponent (scc)
*/
public void setStronglyConnected(){
scc = true;
}
/**
* Restituisce il valore booleano della variabile StronglyConnectedComponent (scc)
*
* @return il valore booleano di scc
*/
public boolean isStronglyConnected(){
return scc;
}
}