
com.github.tommyettinger.gand.algorithms.DepthFirstSearch Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gand Show documentation
Show all versions of gand Show documentation
Pathfinding and other graph algorithms. Based on simple-graphs.
package com.github.tommyettinger.gand.algorithms;
import com.github.tommyettinger.gand.Connection;
import com.github.tommyettinger.gand.Node;
import com.github.tommyettinger.gand.ds.ObjectDeque;
import com.github.tommyettinger.gand.utils.SearchProcessor;
import java.util.ArrayList;
public class DepthFirstSearch extends Algorithm {
private SearchProcessor processor;
private SearchStep step = new SearchStep<>();
private final ObjectDeque> queue;
public DepthFirstSearch(int id, Node start, SearchProcessor processor) {
super(id);
this.processor = processor;
queue = new ObjectDeque<>();
start.resetAlgorithmAttribs(id);
queue.add(start);
start.setSeen(true);
}
@Override
public boolean update() {
if (isFinished()) return true;
Node v = queue.pollFirst();
//System.out.println("poll " + v);
if (processor != null) {
step.prepare(v);
processor.accept(step);
if (step.terminate) {
queue.clear();
return true;
}
if (step.ignore) return isFinished();
}
ArrayList> outEdges = v.getOutEdges();
for (Connection e : outEdges) {
Node w = e.getNodeB();
w.resetAlgorithmAttribs(id);
if (!w.isSeen()) {
w.setIndex(v.getIndex() + 1);
w.setDistance(v.getDistance() + e.getWeight());
w.setConnection(e);
w.setSeen(true);
queue.addFirst(w);
// System.out.println("add " + w);
}
}
// System.out.println("queue " + queue);
return isFinished();
}
@Override
public boolean isFinished() {
return queue.isEmpty();
}
/*
void depthFirstSearch(final Node v, final SearchProcessor processor) {
v.resetAlgorithmAttribs(id);
v.setDistance(0);
recursiveDepthFirstSearch(v, processor, 0, processor != null ? new SearchStep<>() : null);
}
boolean recursiveDepthFirstSearch(Node v, SearchProcessor processor, int depth, SearchStep step) {
if (processor != null) {
step.prepare(v);
processor.accept(step);
if (step.terminate) return true;
if (step.ignore) return false;
}
v.setProcessed(true);
int n = v.getOutEdges().size();
for (int i = 0; i < n; i++) {
Connection e = v.getOutEdges().get(i);
Node w = e.getNodeB();
w.resetAlgorithmAttribs(id);
if (!w.isProcessed()) {
w.setIndex(depth + 1);
w.setDistance(v.getDistance() + e.getWeight());
w.setConnection(e);
if (recursiveDepthFirstSearch(w, processor, depth + 1, step)) {
return true;
}
}
}
return false;
}*/
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy