This commit is contained in:
2025-05-02 13:48:51 +02:00
parent 2be863dcb0
commit 1ff5ea2a75
5 changed files with 322 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
package graph;
public class Edge {
private int length;
private final Node target;
public Edge (int lenght, Node target) {
this.target = target;
this.length = lenght;
}
@Override
public String toString() {
return "-" + length + "->" + target.getName();
}
public Node getTarget() {
return target;
}
}

View File

@@ -0,0 +1,70 @@
package graph;
import java.util.ArrayList;
public class Graph {
private ArrayList<Node> nodes;
public ArrayList<Node> getNodes() {
return nodes;
}
public Node getFirstNode() {
return nodes.get(0);
}
public void addNode(Node n) {
if (nodes.contains(n)) {
throw new IllegalArgumentException();
}
nodes.add(n);
}
public ArrayList<Node> depthFirst(Node startNode) {
unmarkAllNodes();
final ArrayList<Node> collect = new ArrayList<>();
search(startNode, collect);
return collect;
}
private void search(Node node, ArrayList<Node> collect) {
if (node.getMarked()) return;
node.setMarked(true);
collect.add(node);
for (Edge e : node.getOut())
search(e.getTarget(), collect);
}
public ArrayList<Node> breadthFirst(Node startNode) {
unmarkAllNodes();
final ArrayList<Node> collect = new ArrayList<>();
startNode.setMarked(true);
collect.add(startNode);
// Die folgende For-Schleife kann nicht als foreach-loop
// realisiert werden, weil sich collect laufend ändert
for (int i = 0; i < collect.size(); i++)
for (Edge edge : collect.get(i).getOut()) {
final Node target = edge.getTarget();
if (!target.getMarked()) {
target.setMarked(true);
collect.add(target);
}
}
return collect;
}
private void unmarkAllNodes() {
for (Node n : nodes)
n.setMarked(false);
}
@Override
public String toString() {
StringBuilder str = new StringBuilder();
str.append("Grap=\n");
for (Node n : nodes) {
str.append(n).append(";\n");
}
return str.toString();
}
}

View File

@@ -0,0 +1,44 @@
package graph;
import java.util.ArrayList;
public class Node {
private final String name;
private ArrayList<Edge> out = new ArrayList<>();
private boolean marked;
public Node(String name) {
this.name = name;
}
public String getName() {
return name;
}
public ArrayList<Edge> getOut() {
return out;
}
public boolean getMarked() {
return marked;
}
public void setMarked(boolean n) {
marked = n;
}
public void addEdge(Edge e) {
if (out.contains(e)) {
throw new IllegalArgumentException();
}
out.add(e);
}
@Override
public String toString() {
return name + ": " + out;
}
}