Моя DFS иногда не находит правильный путь при наличии нескольких маршрутов.
Вот мой код:
// Graph.java
Код: Выделить всё
package at.htl;
import java.util.ArrayList;
import java.util.List;
public class Graph {
//hinzufügen, löschen von knoten; hinzufügen mit quell, ziel, gewicht, kante; kante löschen mit quell ziel; ob ein knoten existiert; ob zwischen zwei knoten eine kante existiert; eine nachbarschaftliste ausgeben;
private List knotens = new ArrayList();
public void addKnoten(Knoten k) {
if (!existiertKnoten(k.getName())) {
knotens.add(k);
} else {
System.out.println("Knoten " + k.getName() + " existiert bereits.");
}
}
public void deleteKnoten(char name){
Knoten zuLoeschen = findKnoten(name);
if (zuLoeschen != null) {
knotens.remove(zuLoeschen);
for (Knoten k : knotens) {
k.getKanten().removeIf(kante -> kante.getZiel() == name);
}
}
}
public boolean existiertKnoten(char name) {
return findKnoten(name) != null;
}
private Knoten findKnoten(char name) {
for (Knoten k : knotens) {
if (k.getName() == name) {
return k;
}
}
return null;
}
public void addKante(char startName, char zielName, int gewicht) {
Knoten start = findKnoten(startName);
Knoten ziel = findKnoten(zielName);
if (start != null && ziel != null) {
start.addKante(new Kante(zielName, gewicht));
} else {
System.out.println("Fehler: Startknoten oder Zielknoten nicht gefunden!");
}
}
public void deleteKante(char startName, char zielName) {
Knoten start = findKnoten(startName);
if (start != null) {
start.getKanten().removeIf(kante -> kante.getZiel() == zielName);
}
}
public boolean existiertKante(char startName, char zielName) {
Knoten start = findKnoten(startName);
if (start != null) {
for (Kante kante : start.getKanten()) {
if (kante.getZiel() == zielName) {
return true;
}
}
}
return false;
}
public boolean findeWeg(char startName, char zielName) {
Knoten start = findKnoten(startName);
if (start == null) {
System.out.println("Fehler: Startknoten '" + startName + "' nicht gefunden!");
return false;
}
List besucht = new ArrayList();
System.out.println("--- Suche Weg von " + startName + " nach " + zielName + " ---");
boolean gefunden = dfsSucheZiel(start, zielName, besucht, 0);
if (!gefunden) {
System.out.println("-> Suche beendet. Es gibt keinen Weg von " + startName + " nach " + zielName + ".");
}
System.out.println("---------------------------------------");
return gefunden;
}
private boolean dfsSucheZiel(Knoten aktuell, char zielName, List besucht, int bisherigeKosten) {
besucht.add(aktuell.getName());
if (aktuell.getName() == zielName) {
System.out.println(">>> ZIEL '" + zielName + "' ERREICHT! >> ZIEL '" + zielName + "' ERREICHT! ");
if (k.getKanten().isEmpty()) {
System.out.print("Keine Nachbarn");
} else {
for (Kante kante : k.getKanten()) {
System.out.print("[" + kante.getZiel() + " | Gew: " + kante.getG() + "] ");
}
}
System.out.println();
}
System.out.println("---------------------------");
}
}
Код: Выделить всё
package at.htl;
import java.util.ArrayList;
import java.util.List;
public class Knoten {
private char name;
private List kanten;
public Knoten(char name) {
this.name = name;
this.kanten = new ArrayList();
}
public char getName() {
return name;
}
public List getKanten() {
return kanten;
}
public void addKante(Kante kante) {
this.kanten.add(kante);
}
}
Код: Выделить всё
package at.htl;
public class Kante {
private char ziel;
private int g;
public Kante(char ziel, int g) {
this.ziel = ziel;
this.g = g;
}
public char getZiel() {
return ziel;
}
public int getG() {
return g;
}
}
Код: Выделить всё
package at.htl;
public class Main {
static void main() {
Graph testGraph = new Graph();
Knoten kA = new Knoten('A');
Knoten kB = new Knoten('B');
Knoten kC = new Knoten('C');
Knoten kD = new Knoten('D');
testGraph.addKnoten(kA);
testGraph.addKnoten(kB);
testGraph.addKnoten(kC);
testGraph.addKnoten(kD);
// start, ziel, gewicht
testGraph.addKante('A', 'B', 10);
testGraph.addKante('A', 'C', 15);
testGraph.addKante('B', 'D', 20);
testGraph.addKante('C', 'D', 5);
testGraph.printNachbarn();
testGraph.findeWegBFS('A', 'D');
// testGraph.deleteKnoten('D');
//
// testGraph.printNachbarn();
}
}
вместо более короткого пути A->C->D. Почему это происходит?
Мобильная версия