博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dijkstra算法
阅读量:6238 次
发布时间:2019-06-22

本文共 2455 字,大约阅读时间需要 8 分钟。

算法图文详解,已有大神讲解的十分清楚,请移步https://blog.csdn.net/qq_35644234/article/details/60870719

这里我主要看完别人思路,自己写一遍,加深理解;

附java代码和一些自己的理解.

public class Dijkstra {    private static int N = Integer.MAX_VALUE;    private static int[][] Graph = {            {N, 1, 5, N, N, N, N, N, N},            {
1, N, 3, 7, 5, N, N, N, N}, {
5, 3, N, N, 1, 7, N, N, N}, {N, 7, N, N, 2, N, 3, N, N}, {N, 5, 1, 2, N, 3, 6, 9, N}, {N, N, 7, N, 3, N, N, 5, N}, {N, N, N, 3, 6, N, N, 2, 7}, {N, N, N, N, 9, 5, 2, N, 4}, {N, N, N, N, N, N, 7, 4, N}}; /** * 时间复杂度为O(N^2) * 算法思想:一个节点到start节点的距离,有两种情况: * (1)start直连距离(无连接,距离设为无穷大) * (2)通过比直连距离短的节点中转(显然如果中转节点的路径长度比直连距离还短,就没必要从该节点中转) * 第一步先执行(1),初始化各节点到start节点的直连距离,用数组记录 * 第二步执行(2)以直连距离最小的节点为中转,更新与中转节点连通的节点距离,更新数组 * (此步中,中转节点本身的路径已为最优,到中转节点的路径不可能从其他节点中转,原理见(2); * 中转后变短的距离,可看成start节点到该节点拥有了一条更短的直连距离) * 第三步,循环执行第二步确定其他N-2个节点的路径. * * @param start * @param Graph * @return */ public static int[] dijkstra(int start,int[][] Graph){ int[] minDist = new int[Graph.length]; //start节点到各节点的距离 boolean[] findFlag = new boolean[Graph.length]; //标识节点是否找到最短路径 //初始化距离数组和标识数组 for (int i = 0; i < minDist.length; i++) { minDist[i] = Graph[start][i]; findFlag[i] = false; } //初始化初始节点的距离和标识 minDist[start] = 0; findFlag[start] = true; //遍历其他节点,每次遍历确定一个节点的最短路径 for (int v = 1; v < Graph.length; v++) { int temp = 0; //记录中转节点索引 int min = N; //记录start到中转节点的距离 for (int i = 0; i < minDist.length; i++) { if(!findFlag[i] && minDist[i] < min){ min = minDist[i]; temp = i; } } findFlag[temp] = true; for (int i = 0; i < minDist.length; i++) { //如果经过中转节点到i节点,比之前记录的路径要短,则更新路径 // 条件Graph[temp][i] != N不能少,否则后一项计算可能会溢出 if(!findFlag[i]&&Graph[temp][i] != N && minDist[i] > (min+Graph[temp][i])){ minDist[i] = min + Graph[temp][i]; } } } return minDist; } public static void main(String[] args) { int[] res = dijkstra(0,Graph); for (int i = 0; i < res.length; i++) { System.out.print(res[i]+ " "); } }}

 

转载于:https://www.cnblogs.com/wchaos/p/8966639.html

你可能感兴趣的文章
明明白白你的Linux服务器——硬件篇(1)
查看>>
osgi启动级别
查看>>
php防止快速刷屏留言
查看>>
python 登录验证程序
查看>>
Linux
查看>>
限制linux 用户使用su命令转化root权限
查看>>
headfirst PMP-忽视项目职责范围会带来哪些问题?
查看>>
PHP缓存学习之redis
查看>>
以lnmp为基础搭建discuz论坛
查看>>
云计算网络基础-金老师
查看>>
Vim编辑器与Shell编辑器
查看>>
Cisco交换路由配置命令及说明
查看>>
解析sort命令
查看>>
mysql慢查询
查看>>
体会瞬间的舒爽
查看>>
我的友情链接
查看>>
关于网站访问出现的以下问题
查看>>
FFmpeg架构之其他重要数据结构的初始化
查看>>
List(二)
查看>>
Discuz论坛黑链清理教程
查看>>