All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.tommyettinger.gand.algorithms.DepthFirstSearch Maven / Gradle / Ivy

There is a newer version: 0.3.1
Show newest version
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