PDF-Format - IFIS Uni Lübeck

Werbung
Prof. Dr. V. Linnemann
Ho Ngoc Duc
Lübeck, den 18. Mai 2006
Universität zu Lübeck
Institut für Informationssysteme
Einführung in die Informatik II
Informatik B
Sommersemester 2006
7. Übungsblatt
Aufgabe 1: Graphen
Zur Darstellung von gerichteten Graphen durch Adjazenzlisten verwenden wir die folgenden beiden Klassen Knoten und Graph.
public class Knoten {
private String bezeichnung;
private List adjazenzListe;
private int eingangsGrad;
public Knoten(String bezeichnung) {
this.bezeichnung = bezeichnung;
adjazenzListe = new ArrayList();
eingangsGrad = 0;
}
public String getBezeichnung() {
return bezeichnung;
}
public List getAdjazenzListe() {
return adjazenzListe;
}
public String toString() {
return bezeichnung;
}
public int getEingangsGrad() {
return eingangsGrad;
}
public void setEingangsGrad(int eingangsGrad) {
this.eingangsGrad = eingangsGrad;
}
}
public class Graph {
private List knoten = new ArrayList();
public List getKnoten() {
return knoten;
1/4
}
public void addPfeil(Knoten start, Knoten ziel) {
if (!start.getAdjazenzListe().contains(ziel)) {
start.getAdjazenzListe().add(ziel);
ziel.setEingangsGrad(ziel.getEingangsGrad()+1);
}
}
public void removePfeil(Knoten start, Knoten ziel) {
if (!start.getAdjazenzListe().contains(ziel)) {
return;
}
start.getAdjazenzListe().remove(ziel);
ziel.setEingangsGrad(ziel.getEingangsGrad()-1);
}
// ...
}
Jeder Knoten hat eine Bezeichnung und eine Liste von adjazenten Knoten. Ferner speichern wir für jeden Knoten den Eingangsgrad. Der Eingangsgrad eines Knotens wird
geändert, wenn ein Pfeil mit diesem Knoten als Endknoten hinzugefügt oder entfernt
wird.
a) Schreiben Sie in Graph eine Methode public void removeKnoten(Knoten
k), die einen Knoten k zusammen mit allen Pfeilen, die k als Anfangs- oder Endknoten haben, aus dem Graph entfernt. Achten Sie darauf, dass sich durch das Löschen eines Knotens die Eingangsgrade anderer Knoten ändern können. (6 Punkte)
b) Schreiben Sie eine Methode public int[][] getAdjazenzMatrix() in Graph,
die die Darstellung des Graphen durch eine Adjazenzmatrix zurückgibt. (6 Punkte)
c) Implementieren Sie den Algorithmus zur Bestimmung einer topologischen Sortierung aus der Vorlesung. Schreiben Sie dazu eine Methode public static
Map topologischeSortierung(Graph g), die eine Abbildung der Knoten
des Graphen g auf natürliche Zahlen liefert.
(8 Punkte)
Aufgabe 2: Straßenplan
Die für dieses Übungsblatt erstellten Klassen sollen beim kommenden Übungsblatt weiter verwendet werden. Arbeiten Sie also im eigenen Interesse sorgfältig.
Ein Stadtplan soll durch einen Graph repräsentiert werden: ein Stadtplan besteht aus
Orten (Knoten), die durch Straßen (Kanten) miteinander verbunden sein können. Orte und Straßen besitzen einen Namen. Straßen können in beide (ungerichtet) oder nur
eine Richtung (gerichtet) befahrbar sein. Zusätzlich soll für eine Straße die Länge als
2/4
gewichtender Faktor berücksichtigt werden.
Der Stadtplan wird folglich durch einen gerichteten und gewichteten Graph beschrieben.
a) Implementieren Sie eine Klasse Ort, die einen Knoten des Graphen repräsentiert.
Ein Ort hat einen Namen und eine Nummer.
(2 Punkte)
b) Implementieren Sie eine Klasse Strasse, die eine Kante des Graphen repräsentiert.
Eine Straße hat eine Nummer, einen Namen, einen Startort, einen Zielort, ein Gewicht (die Länge der Straße) und eine Komponente, die angibt ob die Straße gerichtet oder ungerichtet ist.
(4 Punkte)
c) Implementieren Sie eine Klasse Stadtplan, die den Graphen repräsentiert. Die Klasse beinhaltet eine Menge von Orten und Strassen. Verwenden Sie eine List-Struktur,
um eine Menge von Objekten zu realisieren.
(4 Punkte)
d) Die Definition eines Stadtplans soll jetzt aus einer Datei gelesen werden. Die Datei
hat folgenden Aufbau:
n
m
1;Knotenname
2;Knotenname
..
n;Knotenname
1;Kantenname ;StartNr ;ZielNr ;Richtung ;Gewicht
2;Kantenname ;StartNr ;ZielNr ;Richtung ;Gewicht
..
m;Kantenname ;StartNr ;ZielNr ;Richtung ;Gewicht
wobei die Anzahl der Orte (Knoten) und
die Anzahl der Strassen (Kanten)
ist. Die Richtung wird durch die Schlüsselwörter gerichtet und ungerichtet
definiert. Das Gewicht ist eine ganze Zahl. Die StartNr und ZielNr bezieht sich
auf die vorher definierten Knotennummern. Die einzelnen Datenfelder sind immer durch Semikola (;) getrennt.
Als Beispiel wird folgender Stadtplan durch eine Datei beschrieben:
3/4
3
2
1;Uni
2;Studentenwohnheim
3;Mensa
1;Hauptstraße;1;3;ungerichtet;300
2;Einbahnstraße;1;2;gerichtet;150
Implementieren Sie in der Klasse Stadtplan eine Methode, die eine solche Datei einliest und die Knoten und Kantenmengen korrekt füllt. Testen Sie Ihre Methode anhand des Stadtplanes Studentendorf.txt, die Sie von der Übungsseite herunterladen
können. Um die Datenfelder aus einer Zeile zu extrahieren, können Sie die Methoden indexOf() und substring der Klasse String verwenden (siehe java.lang.String in
der API).
(10 Punkte)
Hinweise
Kommentieren Sie Ihre Lösungen ! Falls Implementierungen auf dem Blatt gefordert werden, sind diese in gezippter Form mit dem Betreff: Blatt und der entsprechenden Nummer an [email protected] zu schicken, wobei das X durch Ihre Gruppennummer zu ersetzen ist.
Die Gruppeneinteilung für das Sommersemester befindet sich auf der Übungsseite zur Vorlesung und ist bitte unbedingt zu beachten. Falls dennoch ein Tausch
erforderlich sein sollte, kann dieser nur innerhalb der Gruppen des eigenen Studiengangs stattfinden.
Die erste Seite soll oben rechts die Namen der beiden Abgebenden und die Übungsgruppennummer (wichtig!) enthalten. Besteht eine Lösung aus mehreren Zetteln,
so sind diese zusammen zu heften. Bitte keine Hüllen, Mappen, o.ä.
Zertifikat/Scheinkriterium: Für den Schein/das Zertifikat sind 50% der erreichbaren Punkte von jedem Übungsblatt, zweimaliges Vorrechnen in der Übung und
das Bestehen der Klausur am Ende des Semesters erforderlich.
Abgabetermin: Donnerstag, 25. Mai 2006, per E-Mail! (Wegen Feiertag)
4/4
Herunterladen