美文网首页
Dijkstra计算最短路径

Dijkstra计算最短路径

作者: 指尖架构141319 | 来源:发表于2019-12-27 16:13 被阅读0次
image.png

1.撸码

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.PriorityQueue;

/**
 * @description: Dijkstra计算最短路径
 * @author: Liangyb (yunbo.liang@ucarinc.com)
 * @create: 2019/12/27 10:25
 */
class ShortDis {

    public static void main(String[] args){
        //起点
        String start = "A";
        //建立图
        HashMap<String, List<Node>> map = new HashMap<String, List<Node>>();
        map.put("A", Arrays.asList(new Node("B", 5), new Node("C", 1)));
        map.put("B", Arrays.asList(new Node("A", 5), new Node("C", 2),new Node("D",1)));
        map.put("C", Arrays.asList(new Node("A", 1), new Node("B", 2),new Node("D",4),new Node("E",8)));
        map.put("D", Arrays.asList(new Node("B", 1), new Node("C", 4),new Node("E",3),new Node("F",6)));
        map.put("E", Arrays.asList(new Node("D", 3), new Node("C", 8)));
        map.put("F", Arrays.asList(new Node("D", 6)));

        HashMap<String, Node> res = new HashMap<String, Node>();//存放起点到各点的最短路径
        PriorityQueue<Node> queue = new PriorityQueue<Node>();//优先队列,将去入队的节点按其dis字段从小到大的排列
        Node startNode = new Node(start, 0);//起点距离自身的距离为0
        queue.add(startNode);//将起点入队
        //BFS
        while (!queue.isEmpty()) {
            Node cur = queue.poll();//出队 出队的不一定是距离最短的
            if (!res.containsKey(cur.name)) {//添加进入res的一定是最短路径,如果出现重复添加,一定不是最短路径,故舍弃
                res.put(cur.name, cur);//将距离最短的路径添加进res
                List<Node> nodes = map.get(cur.name);//与该节点相邻的节点们
                //遍历
                for (Node node : nodes) {
                    if (res.containsKey(node.name)) continue;//不重复计算已经计算过的节点
                    queue.add(node.setDis(cur.dis).setParent(cur.name));//将没有计算过的入队
                }
            }
        }
        for (String s:res.keySet()) {//打印起点到各点距离
            Node node = res.get(s);
            System.out.println(node.name+":"+node.dis);
        }
    }

    static class Node implements Comparable<Node>{
        String parent;
        String name;
        int dis;

        public Node(String name, int dis) {
            this.name = name;
            this.dis = dis;
        }

        public Node setDis(int dis) {
            this.dis += dis;
            return this;
        }

        public Node setParent(String parent) {
            this.parent = parent;
            return this;
        }

        public int compareTo(Node o) {
            return o.dis>dis?-1:1;
        }
    }
}

相关文章

网友评论

      本文标题:Dijkstra计算最短路径

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