package algo.graph; import ds.graph.Graph; import java.util.Collections; import java.util.List; import java.util.Set; /** * Created by sherxon on 5/16/17. */ public class BidirectionalBFS{ List<Integer> searchBi(Graph graph, Integer source, Integer dest){ BFSHelper sourceData=new BFSHelper(graph, source); BFSHelper destData=new BFSHelper(graph, dest); while (!sourceData.isDone() && !destData.isDone()) { Set<Integer> frontierSource=sourceData.searchLevel(); Set<Integer> frontierDest=destData.searchLevel(); for (Integer integer : frontierDest) { if(frontierSource.contains(integer)) return mergePath(sourceData, destData, integer); } } return null; } private List<Integer> mergePath(BFSHelper sourceData, BFSHelper destData, Integer integer) { List<Integer> pathFromSource = sourceData.getPath(integer); List<Integer> pathFromDest = destData.getPath(integer); Collections.reverse(pathFromSource); pathFromDest.remove(0); pathFromSource.addAll(pathFromDest); return pathFromSource; } }