AuK/Durchläufe durch Graphen SS12

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Java</language>
= Java-Test =

<code id="4f986cf808f9a">
//note to self: code verstecken funktioniert auch innerhalb methoden

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;

}
</code>


<code id="4f9d33b72b119">
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; 
}

</code>

<code id="4f9875926c8ee">
public Object Vertex (char label)
{
   char label = label;
   boolean bereitsBesucht = false;

   return this;
}

</code>

<code id="4f987d51e2b3c">
public Object Graph()
{
   int knotenanzahl = 5;
   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][end] = 1;
      // adjazenzMatrix[end][start] = 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()
   {
      /*for(int col=0; col<max_verts+1; col++)
      adjMat[col][0] = col;

      for(int row=0; row<max_verts+1; row++)
      adjMat[0][row] = row;*/ 
      
      System.out.println("Adjazenzliste:");

      for (int k = 0; k < this.knotenanzahl; ++k) {
        for (int l = 0; l < this.knotenanzahl; ++l) {
           System.out.print(this.adjazenzMatrix[k][l] + "\t");}
        System.out.println("");}
   }
   
   return this;
}
</code>


<run id="4f9875926c9de">
//G1 von S.145
//zur differenzierung ungeeignet - bfs & dfs liefern gleiche ordnung!
theGraph = Graph();

theGraph.addVertex('1');    // 0  (start)
theGraph.addVertex('2');    // 1
theGraph.addVertex('3');    // 2
theGraph.addVertex('4');    // 3
theGraph.addVertex('5');    // 4

theGraph.addEdge(0, 1);     // 1-2
theGraph.addEdge(1, 0);     // 2-1
theGraph.addEdge(1, 3);     // 2-4
theGraph.addEdge(0, 3);     // 1-4
theGraph.addEdge(3, 4);	    // 4-5
theGraph.addEdge(4, 2);     // 5-3
theGraph.addEdge(2, 4);     // 3-5
theGraph.addEdge(2, 2);	    // 3-3

theGraph.zeigeAdjMatrix();

theGraph.dfs();
System.out.println("\n"); 

theGraph.bfs();

//funktioniert prinzipiell
/* TODO:
 * nutzereingabe optimieren (d.h. edge 1 = array-index 1)    ( )
 * adjazenzmatrix darstellen (mit rand)                      (~)
 * queue implementieren + bfs                                (x)
*/
</run>