ciao a tutti, ho come progetto universitario di realizzare un programma in java, senza che abbia necessariamente un iterfaccia grafica, che calcoli lo steiner tree di un grafo non orientato.
Iinnanzitutto tutto premetto che non cerco qualcuno che mi dica come fare tutto il lavoro, vorrei soltanto qualche chiarimento e al massimo qualche consiglio su come fare meglio le strutture di dati che ho preparato o su come svolgere meglio l'algoritmo che ho pensato. Per chi non volesse leggere le strutture che ho postato, in fondo al testo c'è una domanda su un comando che non mi è chiaro a cui penso si possa rispondere brevemente.
Ringrazio in anticipo chi deciderà di dare un'occhiata.
L'idea che ho avuto è di calcolare il minimo albero ricoprente del grafo, dopodichè in ogni coppia di nodi collegati dagli archi del mimimo albero ricoprente volevo svolgere calcolo del cammino minimo che tiene conto anche dei nodi esterni al grafo( i nodi di streiner), eseguito questo controllo il risultato dovrebbe essere lo steiner tree.
Nell'implementazione della struttura dati del grafo ho preparato un'interfaccia
package mio;
import liste.*;
public interface grafo {
public int numNodi();
public int numArchi();
public arco sonoAdiacenti(nodo x, nodo y);// retituisce un arco a=x,y se sono //adiacenti, null altrimenti
public void cambiaInfoNodo(nodo v, Object e);// sostituisce con " e " il contenuto //informativo del nodo
public Object cambiaInfoArco(arco a, Object e);// sostituisce con " e " il contenuto //informativo di a
public nodo aggiungiNodo(Object e); // inserisce un nuovo nodo con contenuto e
public arco aggiungiArco(nodo x, nodo y,Object e);// inserisce un arco x,y di peso e
public void rimuoviNodo(nodo v);// cancella il nodo v e tutti gli archi a esso associati
public void rimuoviArco(arco a);// cancella l'arco a
public listaDoubling nodiBFS( int indice); // restituisce un elenco dei nodi con visita in //ampiezza
public listaDoubling nodiDFS( int indice); // restituisce un elenco dei nodi con visita in //profontità
}
Dove le classi arco e nodo sono rispettivamente
package mio;
public class arco {
Object peso;
nodo iniziale;
nodo finale;
arco(nodo i, nodo f, Object p){
iniziale =i;
finale=f;
peso=p;
}
}
package mio;
public class nodo {
int indice;
Object elem;
nodo(Object e, int i){
elem =e;
indice=i;
}
}
come sottostruttura pensavo di usare una lista( non quella di java)
ma questa
public class lista {
public record first=null,last=null; // record l'ho implementato in modo da svolgere il //lavoro dei puntatori in c++
public void stampa(){
record corrente=first;
System.out.println(" lista= ");
while(corrente!=null){
System.out.println(corrente.elem+"");
corrente=corrente.succ;
}
System.out.println();
};
public boolean èVuoto(){
if (first==null) return true;
else return false;
};
public Object trovaPrimo(){
if (èVuoto()) return null;
else
return first.elem;
};
public Object trovaUltimo(){
if (èVuoto()) return null;
else return last.elem;
};
public void inserisciUltimo(Object el){
record nuovo=new record (el);
if (èVuoto()) first=last=nuovo;
else{
last.succ=nuovo;
nuovo.prec=last;
last=nuovo;
}
};
public void inserisciPrimo(Object el){
record nuovo=new record(el);
if (èVuoto()) first=last=nuovo;
else{
nuovo.succ=first;
first.prec=nuovo;
first=nuovo;
}
};
public Object cancPrimo(){
if (èVuoto()) return null;
else{
Object el=first.elem;
first=first.succ;
if (first!=null)first.prec=null;
else last=null;
return el;
}
};
public Object cancUltimo(){
if(èVuoto()) return null;
else{
Object el=last.elem;
last=last.prec;
if(last!=null) last.succ=null;
else first=null;
return el;
}
}
public void canc(record rec){
if (rec==null) return;
else{
if(rec.prec!=null) rec.prec.succ=rec.succ;
else first=rec.succ;
if(rec.succ!=null) rec.succ.prec=rec.prec;
else last=rec.prec;
}
}
public record trovaPrimoRec(){
if (èVuoto()) return null;
else return first;
}
public record trovaUltRec(){
if(èVuoto()) return null;
else return last;
}
}
ho una domanda riguardo la classe "nodo"
Per verificare quali nodi siano attivi o meno sono indeciso su come fare, ho pensato a una varialbile booleana ma su alcuni esempi del libro di algoritmi ho trovato un comando su una classe nodo che fa lui che non conosco e che non spiega,
public enum state (Active, canc)
la classe è:
public class Nodo{
public enum STATE {ACTIVE, CANC};
public int index;
public Object elem;
public STATE state;
public Nodo(int i, Object e){
index = i;
elem = e;
state = STATE.ACTIVE;
}
}
potreste spiegarmi questa variabile enum ?
scusate se magari ho scritto troppe cose.

Rispondi quotando