Sto provando a realizzare un'importante implementazione del grafico Adjacency List in modo da poter iniziare a lavorare con tutti i tipi di problemi grafici e algoritmi come venditore ambulante e altri problemi ... Ma non riesco a trovare un implementazione decente. Questo è probabilmente perché sto cercando di rispolverare le ragnatele dalla mia classe di strutture dati.
Ma quello che ho finora ... e questo è implementato in Java ... è fondamentalmente una classe edgeNode che ha un tipo generico e un peso, nel caso in cui il grafico sia effettivamente ponderato.
public class edgeNode<E> {
private E y;
private int weight;
//... getters and setters as well as constructors...
}
Ho una classe di grafici che ha un elenco di bordi un valore per il numero di Vertici e un valore int per gli spigoli nonché un valore booleano per indicare se è diretto o meno. La mia prima domanda, se il grafico è effettivamente diretto, non dovrebbe avere un valore nella mia classe edgeNode? O dovrei semplicemente aggiungere altri vertici alla mia LinkedList? Ciò implicherebbe che un grafico diretto è 2 volte più grande di un grafo non orientato, vero?
public class graph {
private List<edgeNode<?>> edges;
private int nVertices;
private int nEdges;
private boolean directed;
//... getters and setters as well as constructors...
}
Finalmente qualcuno ha un modo standard per inizializzare il grafico? Stavo pensando di leggere in un file delimitato da pipe, ma è così il 1997.
public graph GenereateGraph(boolean directed, String file){
List<edgeNode<?>> edges;
graph g;
try{
int count = 0;
String line;
FileReader input = new FileReader("C:\Users\derekww\Documents\JavaEE Projects\graphFile");
BufferedReader bufRead = new BufferedReader(input);
line = bufRead.readLine();
count++;
edges = new ArrayList<edgeNode<?>>();
while(line != null){
line = bufRead.readLine();
Object edgeInfo = line.split("|")[0];
int weight = Integer.parseInt(line.split("|")[1]);
edgeNode<String> e = new edgeNode<String>((String)
edges.add(e);
}
return g;
}
catch(Exception e){
return null;
}
}
Credo che quando aggiungo i bordi se boolean è vero, aggiungerei un secondo edge. Finora, tutto dipende dal file che scrivo. Quindi se ho scritto un file con i seguenti Vertices e pesi ...
Buffalo | 18 br Pittsburgh | 20 br New York | 15 br D.C | 45 br
Ovviamente li caricherò nella mia lista di spigoli, ma come posso rappresentare un vertice collegato all'altro ... così via ... Avrei bisogno dei vertici opposti? Diciamo che stavo rappresentando le autostrade collegate a ogni città ponderate e non dirette (ogni spigolo è bidirezionale con pesi in qualche unità fittizia a distanza) ... La mia implementazione sarebbe il modo migliore per farlo?
Ho trovato questo tutorial online Tutorial grafico che ha un oggetto connettore. Questa mi sembra una raccolta di vertici che si indicano l'un l'altro. Quindi avresti A e B ciascuno con i pesi e così via, e lo aggiungerei ad una lista e questo elenco di connettori al tuo grafico ... Mi sembra un po 'macchinoso e un po' sprezzante del concetto di lista di adiacenza? Ho sbagliato e questa è una nuova soluzione?
Questo è tutto ispirato al Manuale di progettazione dell'algoritmo di steve skiena. Quello che devo dire è abbastanza buono finora. Grazie per l'aiuto che puoi fornire.