Breitensuche mit Parametern Start und Ziel

Wave

Mitglied
Hallo,
ich habe eine Frage zur Breitensuche mit den Parametern Start und Ziel:
Ich finde den Fehler nicht: wenn das Ziel gefunden ist, sollte die Breitensuche abbrechen und nach dem gefundenen Zielknoten keine weiteren Knoten mehr ausgegeben werden.
Die normale Breitensuche Methode "breitensuche(start)" mit einem Parameter Start funktioniert (denke ich).
Wie kann ich mit der Methode Breitensuche für die Parameter Start und Ziel "breitensuche2(start, ziel)" erreichen, dass beim Finden des Zielknotens dann die Breitensuche beendet wird?
Auch meine Testklasse lege ich hier bei.
Bin Schüler und weiß nicht weiter.
Danke.

Java:
public class Knoten{
    
    private String bezeichnung;
    private boolean istBesucht;
    
    public Knoten(String neueBezeichnung){
        bezeichnung = neueBezeichnung;
    }
    
    public String bezeichnungGeben(){
        return bezeichnung;
    }
    
    public void bezeichnungSetzen(String neueBezeichnung){
        bezeichnung = neueBezeichnung;
    }
    
    public boolean istBesuchtGeben(){
        return istBesucht;
    }
    
    public void istBesuchtSetzen(boolean neuIstBesucht){
        istBesucht = neuIstBesucht;
    }
}

Code:
import java.util.*;

public class Graph{

    private Knoten[] knotenfeld;
    private int[][] adjazenzmatrix;
    private int maxAnzahl;
    private int aktAnzahl;
    
    public Graph(int neueMaxAnzahl){
        knotenfeld = new Knoten[neueMaxAnzahl];
        adjazenzmatrix = new int[neueMaxAnzahl][neueMaxAnzahl];
        maxAnzahl = neueMaxAnzahl;
        aktAnzahl = 0;
    }
    
    public Knoten[] knotenfeldGeben(){
        return knotenfeld;
    }
    
    public int[][] adjazenzmatrixGeben(){
        return adjazenzmatrix;
    }
    
    public void knotenEinfuegen(Knoten k){
        if(aktAnzahl < maxAnzahl){
            knotenfeld[aktAnzahl] = k;
            aktAnzahl++;
        }
        else{
            System.out.println("Fehler! Es kann kein Knoten mehr eingefuegt werden.");
        }
    }
    
    public void knotenEinfuegen2(Knoten k){
        if (aktAnzahl < maxAnzahl){
            boolean istEingefuegt = false;
            int index = 0;
            while ((index < maxAnzahl) && (!istEingefuegt)){
                if (knotenfeld[index] == null){
                    knotenfeld[index] = k;
                    istEingefuegt = true;
                }
                else{
                    index++;
                }
            }
            aktAnzahl++;
        }
        else{
            System.out.println("Fehler! Es kann kein Knoten mehr eingefuegt werden.");
        }
    }
    
    public void kanteHinzufuegen(int startindex, int zielindex, int wert){
        if(startindex < 0 || zielindex < 0 || startindex >= aktAnzahl || zielindex >= aktAnzahl){
            System.out.println("Fehler! Falscher Index. Die Kante kann nicht hinzugefuegt werden.");
        }
        else{
            adjazenzmatrix[startindex][zielindex] = wert;
        }
    }
  
    public void kanteEntfernen(int startindex, int zielindex){
        if(adjazenzmatrix[startindex][zielindex] == 0 || startindex >= aktAnzahl || zielindex >= aktAnzahl){
            System.out.println("Fehler! Die Kante kann nicht entfernt werden.");
        }
        else{
            adjazenzmatrix[startindex][zielindex] = 0;
        }
    }
    
    public void alleKantenEntfernen(){
        for(int i = 0; i < maxAnzahl; i++){
            for(int j = 0; j < maxAnzahl; j++){
                adjazenzmatrix[i][j] = 0;
            }
        }
    }
    
    public int knotenindexSuchen(Knoten k){
        int index = -1;
        int i = 0;
        while(index < 0 && i < knotenfeld.length){
            if(knotenfeld[i].equals(k)){
                index = i;
            }
            else{
                i++;
            }
        }
        if(index < 0){
            System.out.println("Fehler! Der Knoten wurde nicht gefunden.");
        }
        return index;
    }
    
    public int knotenindexSuchen2(String name){
        int index = -1;
        int i = 0;
        while(index < 0 && i < knotenfeld.length){
            if(knotenfeld[i].bezeichnungGeben().equals(name)){
                index = i;
            }
            else{
                i++;
            }
        }
        if(index < 0){
            System.out.println("Fehler! Der Knoten wurde nicht gefunden.");
        }
        return index;
    }
    
    public void kanteHinzufuegen2(String start, String ziel, int wert){
        int startindex = knotenindexSuchen2(start);
        int zielindex = knotenindexSuchen2(ziel);
        kanteHinzufuegen(startindex, zielindex, wert);
    }
        
    public void knotenEntfernen(String name){
        int knotenindex = knotenindexSuchen2(name);
        if(knotenindex < 0){
            System.out.println("Fehler! Der Knoten konnte nicht entfernt werden.");
        }
        else{
            for(int i = 0; i < aktAnzahl; i++){
                adjazenzmatrix[knotenindex][i] = 0;
                adjazenzmatrix[i][knotenindex] = 0;
            }
            knotenfeld[knotenindex] = null;
        }   
    }   
    
    public void adjazenzmatrixAusgeben(){
        System.out.print("  ");
        for(int i = 0; i < aktAnzahl; i++){
            System.out.print("  " + i + "  ");
        }
        System.out.println("  ");
        for(int i = 0; i < aktAnzahl; i++){
            System.out.print(i + " ");
            for(int j = 0; j < aktAnzahl; j++){
                System.out.print(" " + adjazenzmatrix[i][j] + " ");
            }
            System.out.println();
        }
    }
    
    public void knotenfeldAusgeben(){
        System.out.println("Knotendaten:");
        for(int i = 0; i < aktAnzahl; i++){
            System.out.println(knotenfeld[i].bezeichnungGeben());
            System.out.println();
        }
    }
    
    public void breitensuche(String start){
        int startindex = knotenindexSuchen2(start);
        if(startindex == -1){
            System.out.println("Fehler! Der Startknoten konnte nicht gefunden werden!");
        }
        else{
            for(int i = 0; i < aktAnzahl; i++){ // Alle Knoten auf "unbesucht" setzen
                knotenfeld[i].istBesuchtSetzen(false);
            }
            ArrayList<Integer> warteschlange = new ArrayList<Integer>();    // Warteschlange fuer die Knoten (Speichern der Indizes)
            warteschlange.add(startindex);  // Hinzufuegen des Startknotens in die Warteschlange
            knotenfeld[startindex].istBesuchtSetzen(true);  // Startknoten auf "besucht" setzen
            System.out.println("Breitensuche: ");
            System.out.println("Knoten " + knotenfeld[startindex].bezeichnungGeben() + " besucht!");
            while(!warteschlange.isEmpty()){
                int aktiverKnotenindex = warteschlange.remove(0);
                for(int i = 0; i < aktAnzahl; i++){
                    if(adjazenzmatrix[aktiverKnotenindex][i] > 0 && !knotenfeld[i].istBesuchtGeben()){
                        knotenfeld[i].istBesuchtSetzen(true);
                        warteschlange.add(i);
                        System.out.println("Knoten " + knotenfeld[i].bezeichnungGeben() + " besucht!");
                    }
                }
            }
        }
    }
    
    public void breitensuche2(String start, String ziel){
        int startindex = knotenindexSuchen2(start);
        int zielindex = knotenindexSuchen2(ziel);
        if(startindex == -1 || zielindex == -1){
            System.out.println("Fehler! Der Startknoten oder der Zielknoten konnte nicht gefunden werden!");
        }
        else{
            for(int i = 0; i < aktAnzahl; i++){ // Alle Knoten auf "unbesucht" setzen
                knotenfeld[i].istBesuchtSetzen(false);
            }
            ArrayList<Integer> warteschlange = new ArrayList<Integer>();    // Warteschlange fuer die Knoten (Speichern der Indizes)
            warteschlange.add(startindex);  // Hinzufuegen des Startknotens in die Warteschlange
            knotenfeld[startindex].istBesuchtSetzen(true);  // Startknoten auf "besucht" setzen
            System.out.println("Breitensuche: ");
            System.out.println("Knoten " + knotenfeld[startindex].bezeichnungGeben() + " besucht!");
            //int aktiverKnotenindex = startindex;
            while(!warteschlange.isEmpty()){ // && aktiverKnotenindex != zielindex
                int aktiverKnotenindex = warteschlange.remove(0);
                if(aktiverKnotenindex == zielindex){
                    System.out.println("Ziel gefunden!");
                    return;
                }
                else{
                    for(int i = 0; i < aktAnzahl; i++){
                        if(adjazenzmatrix[aktiverKnotenindex][i] > 0 && !knotenfeld[i].istBesuchtGeben()){
                            knotenfeld[i].istBesuchtSetzen(true);
                            warteschlange.add(i);
                            System.out.println("Knoten " + knotenfeld[i].bezeichnungGeben() + " besucht!");
                        }
                    }
                }
            }
        }
    }
}

Code:
public class Testablauf{
        
    private Graph g;
    
    public void ablaufen(){
        
        g = new Graph(5);   // Der Graph hat 5 Knoten
        
        Knoten k1 = new Knoten("A");
        Knoten k2 = new Knoten("B");
        Knoten k3 = new Knoten("C");
        Knoten k4 = new Knoten("D");
        Knoten k5 = new Knoten("E");
        
        g.knotenEinfuegen(k1);  // Index 0
        g.knotenEinfuegen(k2);  // Index 1
        g.knotenEinfuegen(k3);  // Index 2
        g.knotenEinfuegen(k4);  // Index 3
        g.knotenEinfuegen(k5);  // Index 4
        
        g.kanteHinzufuegen(0, 1, 3);    // A-B
        g.kanteHinzufuegen(1, 0, 3);
        g.kanteHinzufuegen(0, 2, 4);    // A-C
        g.kanteHinzufuegen(2, 0, 4);
        g.kanteHinzufuegen(0, 4, 1);    // A-E
        g.kanteHinzufuegen(4, 0, 1);
        g.kanteHinzufuegen(1, 2, 2);    // B-C
        g.kanteHinzufuegen(2, 1, 2);
        g.kanteHinzufuegen(2, 3, 1);    // C-D
        g.kanteHinzufuegen(3, 2, 1);
        g.kanteHinzufuegen(3, 4, 5);    // D-E
        g.kanteHinzufuegen(4, 3, 5);
        
        //g.breitensuche("A");
        //g.breitensuche("D");
        //g.breitensuche("C");
        g.breitensuche2("B", "D");
    }
}
 

Barista

Top Contributor
Nach Ansehen des Codes würde ich sagen, dass der Code zum Beenden
Java:
return;
bereits vorhanden ist.
 

Wave

Mitglied
Hallo @Barista,
danke für die Antwort.
Ich meinte: wenn ich die Ausgabe am Bildschirm mache (über die Testklasse), dann kann es passieren, dass wenn ich die Breitensuche von "B" nach "D" mache, nach dem Knoten D noch ein Knoten ausgegeben wird. Der Algorithmus sollte dann eigentlich aber nichts mehr nach "D" ausgeben?

Oder kommen die "restlichen Knoten" noch von den Nachfolgern der unbearbeiteten Nachbarknoten?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Breitensuche Java Basics - Anfänger-Themen 3
K Tiefen- und Breitensuche beim Baum durch Stack und Warteschlange Java Basics - Anfänger-Themen 1
J Tiefen-, Breitensuche Java Basics - Anfänger-Themen 4
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
F HttpURLConnection mit vielen Parametern Java Basics - Anfänger-Themen 3
J Übergabe von Parametern an andere Methoden Java Basics - Anfänger-Themen 5
E Methode mit Parametern um Objekte zu übergeben Java Basics - Anfänger-Themen 4
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
J Methode mouseClicked mit zu übergebenden Parametern Java Basics - Anfänger-Themen 1
J Erste Schritte Java CMD Taschenrechner mit Parametern! Java Basics - Anfänger-Themen 16
B Input/Output Konsolenbefehle mit Parametern Java Basics - Anfänger-Themen 5
C Objekte mit Parametern sortieren Java Basics - Anfänger-Themen 8
U assertEquals mit drei Parametern? Java Basics - Anfänger-Themen 4
F Klassen Ein nicht existierendes Objekt in Parametern übergeben Java Basics - Anfänger-Themen 16
F Java-Programm aus CMD ausführen mit Parametern Java Basics - Anfänger-Themen 7
M Konstruktor mit unterschiedlichen Parametern? Java Basics - Anfänger-Themen 3
M Methode mit beliebigen Parametern in abstrakter Klasse definieren Java Basics - Anfänger-Themen 8
A Methoden Methode mit Parametern Java Basics - Anfänger-Themen 25
M Datentypen Konstruktor mit generischen Parametern überladen Java Basics - Anfänger-Themen 3
M Collections mit >2 type Parametern? Java Basics - Anfänger-Themen 8
M Singleton mit Parametern im Konstruktor Java Basics - Anfänger-Themen 18
M Fragen zu Methoden (void/return), Übergabe von Parametern Java Basics - Anfänger-Themen 3
xehpuk Polymorphie Polymorphie in Parametern Java Basics - Anfänger-Themen 5
N OOP Dynamische Objekte und nach Parametern durchsuchen Java Basics - Anfänger-Themen 4
N Vererbung von Konstruktoren mit Parametern Java Basics - Anfänger-Themen 7
D Funktion mit optionalen Parametern möglich? Java Basics - Anfänger-Themen 3
A Konstruktor mit Parametern Java Basics - Anfänger-Themen 7
O Kleines Problem mit Konstruktor mit Parametern aus generischer Klasse...oder so ;) Java Basics - Anfänger-Themen 2
R Drag&Drop mit Parametern Java Basics - Anfänger-Themen 6
G Übergabe von Parametern an JSP Java Basics - Anfänger-Themen 3
M Methoden aufruf mit optionalen Parametern! Java Basics - Anfänger-Themen 4
G Thread mit Parametern Java Basics - Anfänger-Themen 5
H array aus parametern + hilfe! Java Basics - Anfänger-Themen 4
L Problem mit Aufruf von Objekten,übergeben von Parametern Java Basics - Anfänger-Themen 6
K rekursive Funktion mit mehreren Parametern Java Basics - Anfänger-Themen 5
S Kommandozeile mit 2 Parametern int und boolean Java Basics - Anfänger-Themen 5
G Fenster mit Parametern aufrufen Java Basics - Anfänger-Themen 4
D Klassenaufruf mit mehreren Parametern vereinfachen Java Basics - Anfänger-Themen 10
L JAR-Datei mit Parametern aufrufen Java Basics - Anfänger-Themen 4
P final mit Parametern Java Basics - Anfänger-Themen 3
P Vererbung: Konstruktor mit Parametern Java Basics - Anfänger-Themen 11
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
richrich99 error: illegal start of expression Java Basics - Anfänger-Themen 10
B Quiz mit RMI Probleme mit RMI start Java Basics - Anfänger-Themen 4
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
J Can't start eclipse Java Basics - Anfänger-Themen 5
D Neuer Start- und Endpunkt kann nur an bereits vorhandenen Start- oder Endpunkt anliegen Java Basics - Anfänger-Themen 2
J Compiler-Fehler Illegal Start of expression / '/'expected Java Basics - Anfänger-Themen 3
C NoClassDefFoundError mit externer Jar bei Start aus Eclipse Java Basics - Anfänger-Themen 3
B Schleife von anderer Methode stoppen? (Start continue) Java Basics - Anfänger-Themen 18
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
T Not a Statement/Illegal Start of expression bei for Anweisung Java Basics - Anfänger-Themen 6
N Passwort Anfrage vor Programm start Java Basics - Anfänger-Themen 1
S Fehler: Hauptklasse bin.demo.Start konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 2
S Methoden Beim Start meines Projektes eine Methode ausführen Java Basics - Anfänger-Themen 14
P ,,Illegal start of expression,, Java Basics - Anfänger-Themen 3
S Compiler-Fehler illegal start of expression Java Basics - Anfänger-Themen 4
S Dataflow von Start bis die SystemProperties class Java Basics - Anfänger-Themen 1
M Erste Schritte Start Methode - Exception Java Basics - Anfänger-Themen 1
M "illegal start of type" eindimensionales Schiffe versenken Java Basics - Anfänger-Themen 7
P illegal start of expression wie löse ich das? Java Basics - Anfänger-Themen 2
S Caesar Verschlüsselung Start Hilfe Java Basics - Anfänger-Themen 4
O Methoden Fehlermeldung(Illegal start of expression) bei 4-Gewinnt-Spiel Java Basics - Anfänger-Themen 5
thet1983 start & paint Methode? Java Basics - Anfänger-Themen 0
S Class File Editor gibt beim Start der Programms die Fehlermeldung Source not found aus Java Basics - Anfänger-Themen 1
S JProgressbar mit individuellem Start/Endpunkt Java Basics - Anfänger-Themen 11
R illegal start of expression - 3 Strings vergleichen mit .equals () Java Basics - Anfänger-Themen 5
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
X Compiler-Fehler illegal start of expression Java Basics - Anfänger-Themen 9
Dogge Start:Applet nicht Initialisiert Java Basics - Anfänger-Themen 11
P Illegal start of expression Java Basics - Anfänger-Themen 8
V Start ins Java Game Development Java Basics - Anfänger-Themen 22
M Erster JAR Start überprüfen Java Basics - Anfänger-Themen 6
O Illegal start of expression Java Basics - Anfänger-Themen 3
E Program Start Java Basics - Anfänger-Themen 2
B Threads Interrupt und start Java Basics - Anfänger-Themen 2
E Program Start Java Basics - Anfänger-Themen 2
J JDK installieren JCreator erkennt JDK nicht. "Failed to start the following executable" Java Basics - Anfänger-Themen 3
L Illegal start of expression? Java Basics - Anfänger-Themen 4
T Java Applet braucht mehrere Minuten zu Start Java Basics - Anfänger-Themen 5
M Beim Start Methode laden die Textfelder füllt Java Basics - Anfänger-Themen 5
M Bei *.jar start kompletten String übergeben Java Basics - Anfänger-Themen 7
S Java Web Start lädt keine Bilder Java Basics - Anfänger-Themen 2
M Mehrere Threads nutzen --> run() schneller als start(), Warum? Java Basics - Anfänger-Themen 3
D Start- + Stopzeit Java Basics - Anfänger-Themen 7
J start(); bei bluej Java Basics - Anfänger-Themen 3
R GUI mit if-Verzweigung kombiniert - Illegal start of expression (Dringend) Java Basics - Anfänger-Themen 7
S Illegal Start? Java Basics - Anfänger-Themen 4
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
L Illegal Start of Type, wie finde ich den fehler Java Basics - Anfänger-Themen 4
P BlueJ Fehlermeldung - Illegal Start of Type Java Basics - Anfänger-Themen 8
M Java-web-start weg? Java Basics - Anfänger-Themen 2
S illegal start of expression Java Basics - Anfänger-Themen 2
D OOP Applet-Start Fehler Java Basics - Anfänger-Themen 2
Semox Fehler in Eclipse vor Start eines Applets anzeigen? Java Basics - Anfänger-Themen 2
F Richtiger Start in Java? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben