ToB企服应用市场:ToB评测及商务社交产业平台

标题: 两点间最短间隔 - Dijkstra [打印本页]

作者: 去皮卡多    时间: 2024-12-22 00:53
标题: 两点间最短间隔 - Dijkstra
一、汇总

算法场景说明参考
BFS
无权图的搜刮
标准BFS默认搜刮一条最短路径
改造后可以输出全部最短路径
https://blog.csdn.net/m0_37145844/article/details/144534202
DFS走迷宫重要利用回溯算法思想,不包管最短路径https://blog.csdn.net/m0_37145844/article/details/144534202
  1. Dijkstra
复制代码
带权图最短路径的经典解法重要利用贪心思想,其中在u打印路径时候包含递归,回溯等思想本篇解说
二、Dijkstra 原理

借助java工具类:PriorityQueue 默认内部元素逼迫根据指定规则举行自然排序的的小顶堆,每次选择下层节点到起点开始算的最小权值的节点作为当前节点,举行向外的下一个层级的探索,最终让全部节点都保存了,此节点从开始节点的最小权重值及其最短路径的父节点。
三、Dijkstra 代码实现-Java版本

有必要解说一下代码结构:
  1. package algo.backtrace.Dijkstra.weiwei;
  2. import java.util.*;
  3. public class Dijkstra {
  4.     class Grap {
  5.         // 带权重的无向图表示,邻接矩阵表示
  6.         Map<Integer, List<Edag>> adjList;
  7.         Grap() {
  8.             adjList = new HashMap<>();
  9.         }
  10.         // 添加边
  11.         public void addEdag(int start, int des, int weight) {
  12.             adjList.putIfAbsent(start, new ArrayList<>());
  13.             adjList.putIfAbsent(des, new ArrayList<>());
  14.             adjList.get(start).add(new Edag(des, weight));
  15.             adjList.get(des).add(new Edag(start, weight));
  16.         }
  17.         // 获取一个顶点的所有边
  18.         public List<Edag> getEdags(int node) {
  19.             return adjList.getOrDefault(node, new ArrayList<>());
  20.         }
  21.         // 获取所有顶点
  22.         public Set<Integer> getAllNodes() {
  23.             return adjList.keySet();
  24.         }
  25.     }
  26.     // 描述边
  27.     class Edag{
  28.         int des;
  29.         int weight;
  30.         Edag(int des, int weight) {
  31.             this.des = des;
  32.             this.weight = weight;
  33.         }
  34.     }
  35.     public Map<Integer, Integer> dijkstra(Grap grap, Integer start) {
  36.         // 定义工具
  37.         PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparing(a -> a[1]));
  38.         Map<Integer, Integer> dist = new HashMap<>();
  39.         Map<Integer, Integer> prev = new HashMap<>();
  40.         // 初始化参数
  41.         for (Integer node : grap.getAllNodes()) {
  42.             dist.put(node, Integer.MAX_VALUE);
  43.             prev.put(node, -1);
  44.         }
  45.         dist.put(start, 0);
  46.         pq.offer(new int[]{start, 0});
  47.         while (!pq.isEmpty()) {
  48.             int[] poll = pq.poll();
  49.             int currNode = poll[0];
  50.             int currWeight = poll[1];
  51.             if (currWeight > dist.get(currNode)) {
  52.                 continue;
  53.             }
  54.             for (Edag edag : grap.getEdags(currNode)) {
  55.                 int newDist = currWeight + edag.weight;
  56.                 if (newDist < dist.get(edag.des)) {
  57.                     dist.put(edag.des, newDist);
  58.                     prev.put(edag.des, currNode);
  59.                     pq.offer(new int[]{edag.des, newDist});
  60.                 }
  61.             }
  62.         }
  63.         System.out.println("dist:" + dist);
  64.         System.out.println("prev:" + prev);
  65.         return prev;
  66.     }
  67.     public void printTrace(Map<Integer, Integer> prevMap, int traget, List<Integer> trace) {
  68.         if (prevMap.get(traget) == -1) {
  69.             return;
  70.         }
  71.         traget = prevMap.get(traget);
  72.         printTrace(prevMap, traget, trace);
  73.         trace.add(traget);
  74.     }
  75.     public void main(String[] args) {
  76.         Grap grap = new Grap();
  77.         grap.addEdag(0,1,4);
  78.         grap.addEdag(0,2,1);
  79.         grap.addEdag(1,3,2);
  80.         grap.addEdag(2,3,8);
  81.         grap.addEdag(2,4,3);
  82.         grap.addEdag(4,5,2);
  83.         grap.addEdag(3,5,1);
  84.         Dijkstra dijkstra = new Dijkstra();
  85.         Map<Integer, Integer> prevMap = dijkstra.dijkstra(grap, 0);
  86.         List<Integer> list = new ArrayList<>();
  87.         dijkstra.printTrace(prevMap, 5, list);
  88.         System.out.println(list);
  89.     }
  90. }
  91. // 输出
  92. // dist:{0=0, 1=4, 2=1, 3=6, 4=4, 5=6}
  93. // prev:{0=-1, 1=0, 2=0, 3=1, 4=2, 5=4}
  94. // [0, 2, 4] 瑕疵之处是traget 没有打印出,无伤大雅。
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4