Dijkstra单源最短路

news2024/11/17 21:25:54

Dijkstra单源最短路径

什么是单源最短路径

描述:给定一个带权有向图G = (V,E),其中每条边的权时非负数。另外,给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。

以下图的题为例,进行分析。

设源点为顶点1,采用Dijkstra算法求下图中源V0为到其余各顶点的最短路径。在这里插入图片描述

采用Dijkstra算法(本质是贪心算法)

该算法的基本思想是,设置顶点集合S,并且不断地做贪心选择来扩充这个集合。初始时,S中仅含有源点。设U是G的某一个顶点,把源到U且中间只经过S中顶点的路称为从源到u的特殊路径,并用dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路上度的顶点U,将U添加到S中,同时对数组dist做必要修改。一旦S包含了所有V中顶点,dist就记录了从源到其他所有顶点的最短路径长度。

所以究竟是怎么个贪心策略?我们把所有过程走一遍

对于源点v1,我们初始化。dist [ i ]源点到i的距离。vis [ i ]当前点i是否已经加入S集合。pre [ i ] 当前点 i 的前一个节点

在这里插入图片描述

对于下一个点的选择,我们选择距离最短的那个点继续,即v2。

对于v2点,存在三条边:v2 — > v3,v2 — > v4,v2 — > v5。将dist数组进行更新,如果当前点有其它点遍历到了,那么选择最小的距离。

在这里插入图片描述

对于下一个点,依旧选择最短的,此时选择从v3出发。此时会有点冲突,v2已经到达了v4了,此时v3也到达了v4,这个时候就要更新dist[4]的值

在这里插入图片描述

对于下一个点,依旧选择最短的且没有被加入集合S的,v5。

在这里插入图片描述

对于下一个点,依旧选择最短的且没有被加入集合S的,v4。

在这里插入图片描述

对于下一个点,依旧选择最短的且没有被加入集合S的,v6。

在这里插入图片描述

具体Java代码实现

public class TestDijkstra {
    public static void main(String[] args) {
        int[] dist = new int [7]; //原点到各点的距离
        int[] prev = new int[7]; //前一个节点
        int[][] g = new int[7][7]; //邻接矩阵
        for (int i = 0; i < 7; i++) {
            Arrays.fill(g[i],Integer.MAX_VALUE);
        }
        //添加边权
        g[1][2] = 3;
        g[1][3] = 4;
        g[2][3] = 1;
        g[2][4] = 9;
        g[2][5] = 4;
        g[3][4] = 5;
        g[3][5] = 13;
        g[4][6] = 8;
        g[5][4] = 12;
        g[5][6] = 10;
        dijkstra(1,prev,dist,g);
    }
    public static void dijkstra(int v ,int []prev,int [] dist, int [][] g){
        int n = dist.length - 1;
        if(v < 1 || v > n){
            return;
        }
        //当前节点是否被加入到集合
        boolean[] vis = new boolean[n+1];
        //初始化,第一个到自己,最短路为0,其余点都为无穷
        for (int i = 1; i <= n ; i++) {
            dist[i] = g[v][i];
            vis[i] = false;
            if(dist[i] == Integer.MAX_VALUE){
                prev[i] = 0;
            }else {
                prev[i] = v;
            }
        }
        dist[v] = 0;
        vis[v] = true;
        for (int i = 1; i < n; i++) {
            int tmp = Integer.MAX_VALUE;
            int u = v;
            //选则一个可达最短距离点作为下一次的起点
            for(int j = 1; j <= n; j++){
                if( !vis[j]  && (dist[j] < tmp) ){
                    u = j;
                    tmp = dist[j];
                }
            }
            //最短点加入集合
            vis[u] = true;
            
            //更新dist数组,没有点到则写自己的距离,有点到就写自己与已到点距离的最小值
            for(int j = 1; j <= n;j++){
                if(( !vis[j] ) && ( g[u][j] < Integer.MAX_VALUE )){
                    int newDist = dist[u] + g[u][j];
                    if( newDist < dist[j] ){
                        dist[j] = newDist;
                        prev[j] = u;
                    }
                }
            }
            System.out.println(Arrays.toString(dist));
            System.out.println(Arrays.toString(vis));
            System.out.println(Arrays.toString(prev));
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据在 Mocaverse 项目启动过程中是如何发挥作用的

日期&#xff1a;2023年5月 数据源&#xff1a; Mocaverse Realm Ticket Collection Airdrop & Mocaverse Optimizes an NFT Project at Launch & Beyond NFT 是 Web3 社区的基础。它们是区块链游戏、DAO 和 metaverses 的入场券&#xff0c;以及成为社区参与者的数字…

[创业之路-69]:对管理理念的理解和解读

目录 前言&#xff1a; 一、管理者与领导者的区别 二、管理活动的分类 三、业务管理&#xff1a;以终为始 3.1 业务目标到高效执行 &#xff08;1&#xff09;先明确要做哪些正确的事 》 需求分析、目标 &#xff08;2&#xff09;再明确怎样正确的做事 》 设计、实现 …

chatgpt赋能Python-python3_pygame

Python3 Pygame&#xff1a;游戏引擎进入开发者的时代 Python是一种常用的编程语言&#xff0c;有许多优秀的库和框架&#xff0c;而其中Pygame是许多游戏开发者的首选。Pygame是一个用Python编写的开源软件包&#xff0c;旨在帮助游戏制作者创建交互式游戏和媒体程序。在本篇…

OpenCV基础操作(2)OpevCV算术运算

OpenCV基础操作(2)OpevCV算术运算 import cv2 as cv import numpy as np一、图像的基础操作 1、获取并修改像素值 你可以根据像素的行和列的坐标获取他的像素值。 对 BGR 图像而言&#xff0c;返回值为 B&#xff0c;G&#xff0c;R 的值。对灰度图像而言&#xff0c;会返回他…

微信小程序node+vue+uniapp课程在线答疑学习答题考试系统

系统主要分为管理员和学生、教师三部分&#xff0c;管理员服务端&#xff1a;首页、个人中心、学生管理、教师管理、课程资源管理、课程类型管理、学习记录管理、系统管理&#xff0c;教师服务端&#xff1a;首页、个人中心、课程资源管理、学习记录管理、试题管理、试卷管理、…

JAVA期末考内容知识点的梳理

作者的话 前言&#xff1a;这些都是很基本的&#xff0c;还有很多没有写出来&#xff0c;重点在于考试复习&#xff0c;包括后四章的内容 前面内容请参考JAVA阶段考内容知识点的梳理 一、集合、流 课堂总结1集合 集合概念&#xff1a; 保存和盛装数据的容器&#xff0c;将许多…

maven的常用命令clean/package/install/deploy

如标题&#xff0c;下面放图&#xff1a; 這就是一个pom对应的maven操作命令&#xff0c; 那这些命令中&#xff0c;最常用的打包项目的命令是什么&#xff1f; 两种最常用打包方法&#xff1a; 1.先 clean&#xff0c;然后 package2.先 clean&#xff0c;然后install 下面…

实验四 车辆定位导航

有想自己动手的同学可在末尾看教程 【实验目的】 1、了解全球定位导航系统的定位原理和电子地图技术&#xff0c;掌握电子地图API使用方法。 2、了解导航数据报文数据格式&#xff0c;解析导航数据并在电子地图上进行导航应用。 【实验性质】 验证性实验。 【实验要求】 1、相…

【动态规划专栏】--基础-- 动态规划经典题型

目录 动态规划 动态规划思维&#xff08;基础&#xff09; 状态表示&#xff08;最重要&#xff09; 状态转移方程&#xff08;最难&#xff09; 初始化&#xff08;细节&#xff09; 填表顺序&#xff08;细节&#xff09; 返回值&#xff08;结果&#xff09; 1、第 …

C++实现日期类Date(超详细)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

C++笔试笔记2

C笔试笔记2 百富计算机的笔试 const限定符&#xff1a;首先作用于左边&#xff0c;如果左边没东西&#xff0c;就作用于右边。 const int&#xff1a; 左边没有内容&#xff0c;所以const作用于右边&#xff0c;就是“整型常量”。等同于int const&#xff1b; int * const&am…

NSS LitCTF部分wp

web 1、PHP是世界上最好的语言&#xff01;&#xff01; 直接cat flag flagNSSCTF{11eaebe0-3764-410d-be83-b23532a24235} 2、这是什么&#xff1f;SQL &#xff01;注一下 &#xff01; 直接查询&#xff0c;发现注入点是id 使用sqlmap列出所以数据库 ​sqlmap -u "h…

亚马逊,shopee,lazada卖家如何组建自己的测评团队

测评补单&#xff0c;这个话题在如今不管国内还是国外的电商行业已经是众所周知&#xff0c;它能够快速帮助自己的产品添加评论&#xff0c;获取排名&#xff0c;打造爆款&#xff0c;可以让用户更加真实、清晰、快捷的了解产品&#xff0c;以及产品的使用&#xff0c;快速上手…

低代码,或将颠覆开发行业?

前言 传统的软件开发过程往往需要耗费大量的时间和精力&#xff0c;因为开发人员需编写复杂的代码以完成各种功能。 低代码行业的发展&#xff0c;正好解决了这个问题&#xff0c;让复杂的代码编写一去不复返了。 文章目录 前言引入强大的平台总结 引入 低代码平台 是一种通过可…

【团购-HeaderView Objective-C语言】

一、那么,我们看上面这个东西,这就是我们保存在HeaderView里面的一个东西吧, HeaderView里面的一个东西, 1.因为这个东西,看起来,是不是也是一个这个样子,也是一个固定的样子啊, 所以我们这个UITableView的HeaderView,也可以使用一个xib来描述,也可以使用xib来描述,…

D. The Wu(数据范围)

Problem - D - Codeforces Childan正在编造一个传奇故事并试图出售他的伪造品——一条带有强烈“Wu”感的项链给Kasoura家族。但是&#xff0c;Kasoura先生正在质疑Childan故事的真实性。因此&#xff0c;他将询问有关Childan所谓的“个人珍藏”项链的一些问题。 这个“个人珍…

k8s系列(三)——补充内容

k8s架构补充 高可用集群副本数最好是 > 3 奇数个 master节点 scheduler 调度器&#xff0c;负责介绍任务&#xff0c;选择合适的节点进行分配任务 决定将任务分配至哪个node节点中&#xff0c;与api server进行交互 api server 所有服务访问的统一入口 压力巨大&…

计算机组成原理-计算机系统概述

目录 一&#xff0c;基本组成 二、各部件工作原理 2.1存储器 2.2运算器 2.3控制器 2.4输入设备 2.5输出设备 一条指令的工作原理 三、计算机系统的层次结构 三种基本语言 四、计算机性能指标 一&#xff0c;基本组成 “存储程序”的概念&#xff0c;指将指令以二进制代码的…

English Learning - L3 作业打卡 Lesson2 Day14 2023.5.18 周四

English Learning - L3 作业打卡 Lesson2 Day14 2023.5.18 周四 引言&#x1f349;句1: A brown out is an expression for a reduction in electric power.成分划分弱读连读爆破语调 &#x1f349;句2: Brown outs happen when there is too much demand for electricity.成分…

字节薪酬体系曝光,实在是太强了,真的不服不行...

曾经的互联网是PC的时代&#xff0c;随着智能手机的普及&#xff0c;移动互联网开始飞速崛起。而字节跳动抓住了这波机遇&#xff0c;2015年&#xff0c;字节跳动全面加码短视频&#xff0c;从那以后&#xff0c;抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…