Adjazenzmatrix.java

/*
 *     YAV (Yet another Visualiser)
 *     (c) 2004 by Robin Quast
 *    Version 1.0 (04.03.2004)
 *    
 *  erstellt im Rahmen der Diplomarbeit
 * "Theorie und Java- Realisierung
 *  ausgewählter Algorithmen zur
 *  Bestimmung kürzester Wege in Graphen"
 *
 *  betreut durch Prof. Dr. Lenze
 *  an der Fachhochschule Dortmund
 *  im SS 2003/ WS 2003/2004
 *
 *  @(#)Adjazenzlistenmatrix.java  1.0 04/03/09
 */
import java.*;
import java.util.Vector;
import java.util.Enumeration;
import java.io.*;

/** Diese Kindklasse von Matrix wird zur Darstellung von Graphen benutzt. Die 
 * Matrixobjekte sind Integer Werte. Wird die Matrix durch eine Adjazenzliste 
 * gefüllt, dann sind die Einträge für das Fehlen einer Kante mit 
 * Integer.MAX_VALUE gekennzeichnet.
 */
public class Adjazenzmatrix 
extends Matrix
{
  // zeilen=x, column=y, also kante (1->2) => (1,2) also zeile 1 und spalte 2
  /** Konstruktor, der eine leere Matrix mit den Dimensionen 0x0 erstellt.
   */
  public Adjazenzmatrix() {
    super();
  }

  /** Konstruktor, der anhand der Adjazenzliste die Adjazenzmatrix füllt.
   * Kanten werden durch ihre Werte vorgegeben. Einträge, für die es keine 
   * Kanten gibt sind durch Integer.MAX_VALUE gekennzeichnet. Die 
   * Knoten sollten durchgehend nummeriert sein. Fehlt ein Knoten in der
   * Adjaznzliste, so wird dieser aber in der Matrix dargestellt. Er hat
   * zwar keine Kanten, aber z.B. bei der Berechnung für die kürzeste Wege
   * mit Floyd-Warshall wird dieser berücksichtigt.
   */
  public Adjazenzmatrix(Adjazenzliste al) {
    setAdjazenzmatrix(al);
  }
  
  public void setAdjazenzmatrix(Adjazenzliste al) {
    int nodes=al.getMaxNodeNumber();    
    setDimension(nodes+1,nodes+1);
    init();
    for (int i=0;i<nodes+1;i++) {
      Vector kantenliste =al.getEdgesWithTail(i);
      if (kantenliste!=null) {      
        Enumeration tmp_enum = kantenliste.elements();
        while (tmp_enum.hasMoreElements()) { // solange noch Kanten in der Liste aufgef&uuml;hrt sind
          Edge tmp_edge=(Edge)tmp_enum.nextElement();
          setValue(tmp_edge.getTailValue(),tmp_edge.getHeadValue(),tmp_edge.getCost());
        }
      }
    }
  }
  
  /** Mit dieser Methode kann man alle Matrizeneintr&auml;ge auf den Wert
   * Integer.MAX_VALUE setzen. Um einen anderen beliebigen Wert zu setzen bitte 
   * Methode init(int value) benutzen.
   */
  public void init() {
    init(Integer.MAX_VALUE);
  }
  
  public static void main(String[] args) {
    System.out.println("Testfunktionen der Klasse Adjazenzmatrix");
    Adjazenzmatrix m=new Adjazenzmatrix();
    m.setDimension(3,3);
    m.init();
    m.setValue(2,2,7);
    m.setValue(0,1,2);
    System.out.println("m.toString()\n"+m);

    System.out.println("Erzeugen einer Adjazenzliste.");    
    Adjazenzliste al = new Adjazenzliste ();
    System.out.println("Adjazenzliste: " + al.toString() "\n");    
    
    System.out.println("Erzeugen der Kanten 0,1 und 1,2 \n");    
    Edge eins = new Edge (0,1,3);
    Edge zwei = new Edge (1,2,4);
    Edge drei = new Edge (1,3,5);
    
    System.out.println("eins.toString() " + eins.toString());
    System.out.println("zwei.toString() " + zwei.toString()+"\n");
        
    System.out.println("Hinzuf&uuml;gen der Kante 0,1");
    al.add(eins);
    System.out.println("Adjazenzliste: \n" + al.toString() "\n");    
    
    System.out.println("Hinzuf&uuml;gen der Kante 1,2");
    al.add(zwei);
    System.out.println("Adjazenzliste: \n" + al.toString() "\n");    

    System.out.println("Hinzuf&uuml;gen der Kante 1,3");
    al.add(drei);
    System.out.println("Adjazenzliste: \n" + al.toString() "\n");    
    m.setAdjazenzmatrix(al);
    System.out.println("Matrix:"+m);

  }


}