当前位置: 首页 > news >正文

Dijkstra算法

算法图文详解,已有大神讲解的十分清楚,请移步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

相关文章:

  • 几种不错的编程字体
  • byte[]数组的正则表达式搜索 z
  • File类基本操作之OutputStream字节输出流
  • 全限定名
  • vsftpd基于pam_mysql的认证和hash编码的方式配置虚拟用户
  • Java中char转为16进制
  • 人脸识别算法初次了解
  • Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器...
  • Linux Memory Hotplug
  • 25个增强iOS应用程序性能的提示和技巧
  • 20165306 课下作业(第十周)
  • tortoise svn连接问题
  • 又一款基于BCH开发出来的社交软件BlockPress
  • 企业CIO如何做好免费ERP系统的选型
  • 【table】给table表格设置一个通用的css3样式(默认有斑马条纹)
  • DOM的那些事
  • JS学习笔记——闭包
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • ReactNativeweexDeviceOne对比
  • Wamp集成环境 添加PHP的新版本
  • 欢迎参加第二届中国游戏开发者大会
  • 回顾2016
  • 基于遗传算法的优化问题求解
  • 聚簇索引和非聚簇索引
  • 如何优雅地使用 Sublime Text
  • 山寨一个 Promise
  • 什么是Javascript函数节流?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信小程序实战练习(仿五洲到家微信版)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 原生 js 实现移动端 Touch 滑动反弹
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 转载:[译] 内容加速黑科技趣谈
  • 最近的计划
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • NLPIR智能语义技术让大数据挖掘更简单
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • #vue3 实现前端下载excel文件模板功能
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (HAL库版)freeRTOS移植STMF103
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (力扣)1314.矩阵区域和
  • (五)c52学习之旅-静态数码管
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 流——流的类型体系简单介绍
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net的socket示例
  • .NET中使用Redis (二)
  • /var/lib/dpkg/lock 锁定问题
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [Django 0-1] Core.Email 模块
  • [hdu 3652] B-number