Zum Inhalt
Durchläufe durch Graphen SS12
Aus ProgrammingWiki
<
AuK
Archivierte Version vom 2012-05-04T13:16:22+00:00.
Aktuelle Version
Inhaltsverzeichnis
1
Wiederholung
2
Unterscheidung von Durchlaufproblemen
2.1
Durchlauf aller Knoten
2.2
Durchlauf aller Kanten
3
Java-Test
Wiederholung
Unterscheidung von Durchlaufproblemen
Durchlauf aller Knoten
Durchlauf aller Kanten
Java-Test
//note to self: code verstecken funktioniert auch innerhalb methoden //note to self2: applet: http://www.cosc.canterbury.ac.nz/mukundan/dsal/GraphAppl.html meh~ public Object Stack() { int groesse = 20; int[] elemente = new int[groesse]; int top = -1; public void push(int j) {elemente[++top] = j;} public int pop() {return elemente[top--];} public int peek() {return elemente[top];} public boolean istLeer() {return (top == -1);} return this; }
public Object Queue() { int[] elemente = new int[0]; int top; int groesse = elemente.length; public boolean istLeer() { groesse = elemente.length; return groesse == 0; } public int peek() { top = elemente[0]; return top; } public void enqueue(int element) { groesse = elemente.length; int[] neu = new int[groesse +1]; for (int i=0; i<=groesse-1; i++) neu[i] = elemente[i]; neu[groesse] = element; elemente = neu; top = elemente[0]; } public int dequeue() { top = elemente[0]; groesse = elemente.length; int[] neu = new int[groesse-1]; for(int i = 0; i < groesse-1; i++) neu[i] = elemente[i+1]; elemente = neu; return top; } return this; }
public Object Vertex (char label) { char label = label; boolean bereitsBesucht = false; return this; }
public Object Graph(int max) { int knotenanzahl = max; Object[] knotenliste = new Object[knotenanzahl+1]; int knoten = 0; int[][] adjazenzMatrix = new int[knotenanzahl+1][knotenanzahl+1]; Object stacky = Stack(); Object queuey = Queue(); for(int i =0; i<=knotenanzahl; i++) for(int j=0; j<=knotenanzahl; j++) adjazenzMatrix[i][j] = 0; public void addEdge(int start, int end) { adjazenzMatrix[start-1][end-1] = 1; // adjazenzMatrix[end-1][start-1] = 1; //nur für ungerichtete Graphen!! } public void addVertex(char lab) { knotenliste[knoten++] = Vertex(lab); } public void displayVertex(int v) { System.out.print(knotenliste[v].label); } public void dfs() { System.out.println("\nDFS-Durchlaufordnung:"); knotenliste[0].bereitsBesucht=true; displayVertex(0); stacky.push(0); while (!stacky.istLeer()) { int v = getAdjUnvisitedVertex(stacky.peek()); if(v == -1) stacky.pop(); else { knotenliste[v].bereitsBesucht = true; displayVertex(v); stacky.push(v); } } for(int j=0; j<knoten; j++) knotenliste[j].bereitsBesucht = false; } public void bfs() { System.out.println("\nBFS-Durchlaufordnung:"); knotenliste[0].bereitsBesucht = true; displayVertex(0); queuey.enqueue(0); while( !queuey.istLeer() ) { int v = getAdjUnvisitedVertex( queuey.peek() ); if(v == -1) queuey.dequeue(); else { knotenliste[v].bereitsBesucht = true; displayVertex(v); queuey.enqueue(v); } } for(int j=0; j<knoten; j++) knotenliste[j].bereitsBesucht = false; } public int getAdjUnvisitedVertex(int v) { for(int j=0; j<knoten; j++) if(adjazenzMatrix[v][j] == 1 && knotenliste[j].bereitsBesucht==false) return j; return -1; } public void zeigeAdjMatrix() { System.out.println("Adjazenzmatrix:"); Object[][] showMat = new Object[knotenanzahl+1][knotenanzahl+1]; showMat[0][0] = ' ' ; for(int i=0; i<knotenanzahl; i++){ for(int row=1; row<=knotenanzahl; row++){ showMat[0][row] = this.knotenliste[row-1].label; showMat[i+1][row] = this.adjazenzMatrix[i][row-1];} for(int col=1; col<=knotenanzahl; col++){ showMat[col][0] = this.knotenliste[col-1].label; showMat[col][i+1] = this.adjazenzMatrix[col-1][i];}} for (int k = 0; k<=knotenanzahl; ++k) { for (int l = 0; l<=knotenanzahl; ++l) { System.out.print(showMat[k][l] + "\t");} System.out.println("");} } return this; }
//G1 von S.145 //zur differenzierung ungeeignet - bfs & dfs liefern gleiche ordnung! //G aus PDF-09 besser!! theGraph = Graph(6); theGraph.addVertex('A'); // 1 (start) theGraph.addVertex('B'); // 2 theGraph.addVertex('C'); // 3 theGraph.addVertex('D'); // 4 theGraph.addVertex('E'); // 5 theGraph.addVertex('F'); // 6 theGraph.addEdge(1, 2); // A-B theGraph.addEdge(1, 3); // A-C theGraph.addEdge(1, 6); // A-F theGraph.addEdge(2, 3); // B-C theGraph.addEdge(2, 4); // B-D theGraph.addEdge(3, 4); // C-D theGraph.addEdge(3, 5); // C-E theGraph.addEdge(3, 6); // C-F theGraph.addEdge(4, 5); // D-E theGraph.addEdge(4, 3); // D-C theGraph.addEdge(5, 6); // E-F theGraph.zeigeAdjMatrix(); theGraph.dfs(); System.out.println("\n"); theGraph.bfs(); //funktioniert prinzipiell /* TODO: * konstruktor mit parameterübergabe (x) * nutzereingabe optimieren (d.h. edge 1 = array-index 1) (x) * adjazenzmatrix darstellen (mit rand) (x) * queue implementieren + bfs (x) * YAY~ :D */
ausführen
Seite
Quelltext
Versionen/Autoren
Konto registrieren
Anmelden
Navigation
Startseite
Letzte Änderungen
Alle Seiten
Einführungskurs
Hilfe
Dateien
Suche
Suchen
Werkzeuge
Links auf diese Seite
Spezialseiten