美文网首页
Java实现广度优先算法-找出图中两个节点的最短路径。

Java实现广度优先算法-找出图中两个节点的最短路径。

作者: 写代码的杰西 | 来源:发表于2020-03-01 21:39 被阅读0次

广度优先算法,用来查找图中两个节点的最短路径。这里的最短是指最短边数。

思路:从起点开始,依次把自己的邻居放入待搜索队列。然后每次从队列弹出头部,判断是不是要找的节点,不是就把自己的邻居放入队列。这样搜索的顺序就是一层一层的,找到的时候路径也是最短的。

示例图

下面是代码。采用邻接表来实现图。adjList是这个图的邻接表。waitSearchQueue是等待搜索的队列。visitedList是已经搜索过的节点散列表。


public class GraphBfs {
    private Map<Integer, List<Integer>> adjList = new HashMap<>();//key是id value是他的邻居

    //初始化图
    public void initialGraph(){
        List<Integer> adj1 = new LinkedList<>();
        adj1.add(2);
        adj1.add(3);
        List<Integer> adj2 = new LinkedList<>();
        adj2.add(4);
        adj2.add(5);
        List<Integer> adj3 = new LinkedList<>();
        adj3.add(4);
        adj3.add(6);
        List<Integer> adj4 = new LinkedList<>();
        adj4.add(5);
        List<Integer> adj5 = new LinkedList<>();
        adj5.add(6);
        List<Integer> adj6 = new LinkedList<>();
        this.adjList.put(1,adj1);
        this.adjList.put(2,adj2);
        this.adjList.put(3,adj3);
        this.adjList.put(4,adj4);
        this.adjList.put(5,adj5);
        this.adjList.put(6,adj6);
    }

    //广度优先 寻找最短路径
    public void bfs(int startId,int endId){
        Queue<Node> waitSearchQueue = new LinkedList<>();//等待被搜索的队列
        Map<Integer,Node> visitedList = new HashMap<>(); //访问过的节点列表
        waitSearchQueue.offer(new Node(startId,-1)); //将开始节点入队
        while(!waitSearchQueue.isEmpty()){ //队列不空
            Node currentNode = waitSearchQueue.poll(); //从队列头弹出
            System.out.println("当前目标:"+currentNode.id);
            if(currentNode.id == endId){ //如果找到了
                System.out.println("找到目标:"+currentNode.id);
                printPath(currentNode,visitedList); //打印出来路径  注意是反向的
                return;
            }
            if(visitedList.keySet().contains(currentNode.id)){ //如果搜索过的就不第二次搜索了
                continue;
            }
            //将当前节点的邻居都入队
            for(int i=0;i<this.adjList.get(currentNode.id).size();i++){
                int nodeId = this.adjList.get(currentNode.id).get(i);
                //如果访问过的就不用入队了。入队的话parentid就错了
                if(!visitedList.keySet().contains(nodeId)){
                    waitSearchQueue.offer(new Node(nodeId,currentNode.id));
                }
            }
            //标示当前节点访问过了
            visitedList.put(currentNode.id,currentNode);
        }
        System.out.println("没有路径");
    }

    //  打印出路径
    private void printPath(Node targetNode, Map<Integer, Node> visitedList){
        int parentId = targetNode.parentId;
        System.out.print(targetNode.id+"==>");
        while (parentId!=-1){
            int id = visitedList.get(parentId).id;
            parentId = visitedList.get(parentId).parentId;
            if(parentId==-1){
                System.out.print(id);
            }else{
                System.out.print(id+"==>");
            }
        }
    }

    //每一个节点的抽象   这里只存储id
    static class Node{
        private int id;
        private int parentId;
        public Node(int id,int parentId){
            this.id=id;
            this.parentId=parentId;
        }

    }

    public static void main(String[] args) {
        GraphBfs graphBfs = new GraphBfs();
        graphBfs.initialGraph();
        graphBfs.bfs(1,5);
    }
}

相关文章

  • Java实现广度优先算法-找出图中两个节点的最短路径。

    广度优先算法,用来查找图中两个节点的最短路径。这里的最短是指最短边数。 思路:从起点开始,依次把自己的邻居放入待搜...

  • 狄克斯特拉算法

    要计算非加权图中的最短路径, 可使用广度优先搜索。 要计算加权图中的最短路径,可使用狄克斯特拉算法。 在无向图中,...

  • 读书打卡 <<算法图解-第六章 广度优先搜索>>

    1.广度优先搜索(BFS)用于解决最短路径问题 2.边(edge)和节点(node)组成图 3.实现广度优先搜索的...

  • 广度优先搜索

    广度优先搜索指出是否有A到B的路径 如果有,广度优先搜索将找出最短的路径面临类似于找最短路径的问题时,可以尝试使用...

  • 搜索

    一、深度优先搜索 图深度优先遍历、深度优先搜索算法求有权图两点最短路径 二、广度优先搜索 图广度优先遍历、广度优先...

  • 数据结构错题收录(十)

    1、下列关于广度优先算法的说法中,正确的是()。 Ⅰ.当各边的权值相等时,广度优先算法可以解决单源最短路径问题 Ⅱ...

  • 算法图解-广度优先搜索 6/11

    7 狄克斯特拉算法(带权的最短路径,地图路线中的算法)有点没看明白,下期整理。 6 广度优先搜索 广度优先搜索(b...

  • 广度优先搜索算法(Breadth-First Search ,

    前言:广度优先搜索可回答两类问题, 从节点A触发,有前往节点B的路径吗? 从节点A触发,前往节点B的哪条路径最短?...

  • 狄克斯特拉算法

    狄克斯特拉算法,当然是狄克斯特拉发明的。 这是相对广度优先搜索而产生的在加权路图中寻找最短路径的算法。 加权图,就...

  • 数据结构-图

    邻接矩阵中的两个最短路径算法,Djkstra,Floyd 以邻接表存储的两种遍历,深度优先遍历和广度优先遍历,类比...

网友评论

      本文标题:Java实现广度优先算法-找出图中两个节点的最短路径。

      本文链接:https://www.haomeiwen.com/subject/vqfhkhtx.html