71 lines
1.9 KiB
Java
71 lines
1.9 KiB
Java
package graph;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
public class Graph {
|
|
private ArrayList<Node> nodes = new ArrayList<>();
|
|
|
|
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();
|
|
}
|
|
}
|