Finding the shortest path nodes with breadth first search

前端 未结 3 969
轮回少年
轮回少年 2020-12-10 17:02

I am running breadth first search on the above graph to find the shortest path from Node 0 to Node 6.

My code

pu         


        
3条回答
  •  攒了一身酷
    2020-12-10 17:47

    As you can see in acheron55 answer:

    "It has the extremely useful property that if all of the edges in a graph are unweighted (or the same weight) then the first time a node is visited is the shortest path to that node from the source node"

    So all you have to do, is to keep track of the path through which the target has been reached. A simple way to do it, is to push into the Queue the whole path used to reach a node, rather than the node itself.
    The benefit of doing so is that when the target has been reached the queue holds the path used to reach it.
    Here is a simple implementation :

    /**
     * unlike common bfs implementation queue does not hold a nodes, but rather collections
     * of nodes. each collection represents the path through which a certain node has
     * been reached, the node being the last element in that collection
     */
    private Queue> queue;
    
    //a collection of visited nodes
    private Set visited;
    
    public boolean bfs(Node node) {
    
        if(node == null){ return false; }
    
        queue = new LinkedList<>(); //initialize queue
        visited = new HashSet<>();  //initialize visited log
    
        //a collection to hold the path through which a node has been reached
        //the node it self is the last element in that collection
        List pathToNode = new ArrayList<>();
        pathToNode.add(node);
    
        queue.add(pathToNode);
    
        while (! queue.isEmpty()) {
    
            pathToNode = queue.poll();
            //get node (last element) from queue
            node = pathToNode.get(pathToNode.size()-1);
    
            if(isSolved(node)) {
                //print path 
                System.out.println(pathToNode);
                return true;
            }
    
            //loop over neighbors
            for(Node nextNode : getNeighbors(node)){
    
                if(! isVisited(nextNode)) {
                    //create a new collection representing the path to nextNode
                    List pathToNextNode = new ArrayList<>(pathToNode);
                    pathToNextNode.add(nextNode);
                    queue.add(pathToNextNode); //add collection to the queue
                }
            }
        }
    
        return false;
    }
    
    private List getNeighbors(Node node) {/* TODO implement*/ return null;}
    
    private boolean isSolved(Node node) {/* TODO implement*/ return false;}
    
    private boolean isVisited(Node node) {
        if(visited.contains(node)) { return true;}
        visited.add(node);
        return false;
    }
    

    This is also applicable to cyclic graphs, where a node can have more than one parent.

提交回复
热议问题