Hi leute, ich muss die nachfolgende, für gerichtete Graphen entworfene Klasse Graph verwenden, um die Klasse UnGraph zu implementieren, die die selben Methoden (Hinzufügen/Entfernen/Zählen/Existenzprüfung von Kanten, Ausgabe der Adjazenzmatrix) für ungericchtete Graphen bereitstellt.
Dazu sollen wir das Prinzip der Vererbung nutzen!
Die Klasse Graph habe ich schonmal zum laufen gebracht:
Ausgabe:
5
0 1 0 0 0
0 0 0 1 0
0 1 0 0 1
0 0 0 0 1
0 0 0 0 0
Graph$InvalidVertexException: Vertex number5is out of range [0,4]
Nun muss ich es für ungerichtete Graphen ändern. Das heißt dann wenn ein Knoten in beide Richtungen erreichbar ist, wie z.B. g.addEdge(1, 3); g.addEdge(3, 1); dann wäre hier das der fall bei 1 und 3. Müsste dann neben der 0 und 1 eine 2 als ausgabe kommen? Wegen beiden Richtungen?
Bin ich gedanklich schonmal auf dem richtigen Weg? Und wo müsste ich anfangen um es im Code durchzusetzen?
Hoffe ihr könnt mir helfen! Vielen Dank im Voraus!
Dazu sollen wir das Prinzip der Vererbung nutzen!
Die Klasse Graph habe ich schonmal zum laufen gebracht:
Java:
public class Graph {
private int n;
private boolean[][] adj;
private int edgecount = 0;
public Graph( int n) {
if(n < 0) {
throw new IllegalArgumentException(
"n must not be less than 0.");
}
this.n = n;
this.adj = new boolean[n][n];
}
private void checkVertex(int v) {
if (v < 0 || v >= this.n) {
throw new InvalidVertexException(
v, this.n);
}
}
public boolean hasEdge(int from, int to) {
this.checkVertex(from);
this.checkVertex(to);
return this.adj[from][to];
}
public boolean addEdge(int from, int to) {
this.checkVertex(from);
this.checkVertex(to);
if (!this.adj[from][to]) {
this.adj[from][to] = true;
this.edgecount++;
return true;
} else {
return false;
}
}
public boolean removeEdge(int from, int to) {
this.checkVertex(from);
this.checkVertex(to);
if (this.adj[from][to]) {
this.adj[from][to] = false;
this.edgecount--;
return true;
} else {
return false;
}
}
public int countEdges() {
return this.edgecount;
}
public String toString() {
StringBuilder b = new StringBuilder();
for (int i = 0; i < this.n; ++i) {
for(int j = 0; j < this.n; ++j) {
b.append(adj[i][j] ? '1' : '0');
if (j < n - 1) {
b.append(' ');
}
}
b.append('\n');
}
return b.toString();
}
public static class InvalidVertexException
extends IndexOutOfBoundsException {
public InvalidVertexException (int v, int n) {
super("Vertex number"+ v + "is out of range [0," + (n-1) + "]");
}
}
public static void main(String[] args) {
Graph g = new Graph(5);
g.addEdge(0, 1); g.addEdge(1, 3); g.addEdge(2, 1); g.addEdge(2, 4); g.addEdge(3, 4);
System.out.println(g.countEdges() + "\n" + g.toString());
try { g.removeEdge(5, 5); } catch (InvalidVertexException e) {
System.out.println(e);
}
}
}
Ausgabe:
5
0 1 0 0 0
0 0 0 1 0
0 1 0 0 1
0 0 0 0 1
0 0 0 0 0
Graph$InvalidVertexException: Vertex number5is out of range [0,4]
Nun muss ich es für ungerichtete Graphen ändern. Das heißt dann wenn ein Knoten in beide Richtungen erreichbar ist, wie z.B. g.addEdge(1, 3); g.addEdge(3, 1); dann wäre hier das der fall bei 1 und 3. Müsste dann neben der 0 und 1 eine 2 als ausgabe kommen? Wegen beiden Richtungen?
Bin ich gedanklich schonmal auf dem richtigen Weg? Und wo müsste ich anfangen um es im Code durchzusetzen?
Hoffe ihr könnt mir helfen! Vielen Dank im Voraus!