/*
* 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ü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ä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ügen der Kante 0,1");
al.add(eins);
System.out.println("Adjazenzliste: \n" + al.toString() + "\n");
System.out.println("Hinzufügen der Kante 1,2");
al.add(zwei);
System.out.println("Adjazenzliste: \n" + al.toString() + "\n");
System.out.println("Hinzufügen der Kante 1,3");
al.add(drei);
System.out.println("Adjazenzliste: \n" + al.toString() + "\n");
m.setAdjazenzmatrix(al);
System.out.println("Matrix:"+m);
}
}
|