// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU Lesser General Public License (LGPL): http://www.gnu.org/licenses/ /* * BreadthFirstSearch.java * * Created on November 21, 2004, 12:58 AM */ package graphtea.library.algorithms.traversal; import graphtea.library.BaseEdge; import graphtea.library.BaseGraph; import graphtea.library.BaseVertex; import graphtea.library.algorithms.Algorithm; import graphtea.library.algorithms.AutomatedAlgorithm; import graphtea.library.algorithms.util.EventUtils; import graphtea.library.event.GraphRequest; import graphtea.library.event.PreWorkEvent; import graphtea.library.event.VertexRequest; import graphtea.library.event.handlers.PreWorkHandler; import graphtea.library.exceptions.InvalidVertexException; import java.util.LinkedList; /** * Description here.! * * @author Omid Aladini */ public class BreadthFirstSearch<VertexType extends BaseVertex, EdgeType extends BaseEdge<VertexType>> extends Algorithm implements AutomatedAlgorithm { private BaseGraph<VertexType, EdgeType> graph; public BreadthFirstSearch(BaseGraph<VertexType, EdgeType> graph) { this.graph = graph; } public BreadthFirstSearch() { this.graph = null; } public boolean doSearch(VertexType vertex, PreWorkHandler<VertexType> handler) throws InvalidVertexException { //int vertexId = vertex.getId(); for (VertexType v : graph) v.setMark(false); vertex.setMark(true); LinkedList<VertexType> queue = new LinkedList<>(); LinkedList<VertexType> roots = new LinkedList<>(); queue.offer(vertex); roots.offer(vertex); try { while (queue.size() != 0) { VertexType index = queue.poll(); VertexType root = roots.poll(); if (handler != null) if (handler.doPreWork(root, index)) return true; dispatchEvent(new PreWorkEvent<>(root, index, graph)); EventUtils.algorithmStep(this, "explore: " + index.getId()); for (VertexType i : graph) { if (graph.isEdge(index, i) && !i.getMark()) { i.setMark(true); EventUtils.algorithmStep(this, "visit: " + i.getId()); queue.offer(i); roots.offer(index); } } } } catch (Exception e) { throw new RuntimeException(e); } return false; } public void doAlgorithm() { GraphRequest<VertexType, EdgeType> gr = new GraphRequest<>(); dispatchEvent(gr); this.graph = gr.getGraph(); VertexRequest<VertexType, EdgeType> vr = new VertexRequest<>(graph, "Please choose a vertex for the BFS algorithm."); dispatchEvent(vr); this.doSearch(vr.getVertex(), null); } }