迪杰斯特拉算法浅析

2023-11-17

所谓的迪杰斯特拉算法,就是一个用来求一个图中某点到其它点的最短路径的算法。

大致方法:

  1. 遍历所有节点,找到离起点最近的一个点(那么这个点到起点的最小距离肯定是起点到这个点的这条边的权值),然后标记这个点被使用过了

  1. 以1中的那个点为中继,更新其它节点到起点的距离,也就是更新这个dis数组,怎么更新呢?当然是遍历所有点,如果这个点原先到起点的距离大于现在经过中继到起点的距离,那么就用这个较小的值更新dis数组

下面讲一下是怎么实现的。

  • 首先是采用邻接矩阵来储存图,有向图或者无向图均可,这里用有向图举例:

const int INF=1e7;
int mp[105][105];
int n;//节点个数
int m;//边的条数
cin>>n>>m;
//初始化边为无穷大
for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        mp[i][j]=INF;
//输入边的数据
while(m--)
{
    cin>>u>>v>>w;
    mp[u][v]=min(mp[u][v],w);
    //若是无向图,则增加下面一行:
    //mp[v][u]=mp[u][v];
}
  • 接下来就是迪杰斯特拉算法辣:

void Dijkstra(int u)
{
    //首先是要开一个数组来储存我们的到某个点的最短距离
    int dis[105];
    //然后开一个数组用来记录这个点有没有被遍历
    bool visit[105];
    //初始化起点u到其他各个顶点的最短路径长度
    for(int i=1;i<=n;i++)
    {
        dis[i]=mp[u][i];
        visit[i]=false;
    }
    //起点到起点的距离当然是0咯:
    dis[u]=0;
    visit[u]=true;
    //循环寻找离起点最近的点:
    for(int i=1;i<=n;i++)
    {
        int min=INF;
        int t=u;
        for(int j=1;j<=n;j++) 
           if(!visit[j]&&dis[j]<min)
           {
                   t=j;
                   min=dis[j];
           }
        if(t==u) 
            return;//没有与起点连接的点了,跳出循环。 
        visit[t]=true;
        for(int j=1;j<=n;j++)//更新与中继点t邻接的点到起点u的距离 
           if(!visit[j]&&mp[t][j]<INF)
             if(dis[j]>(dis[t]+mp[t][j]))
                 dis[j]=dis[t]+mp[t][j];
    }
}

例题:

问题 H: 2.5 一场说走就走的旅行

内存限制:128 MB时间限制:1.000 S评测方式:文本比较命题人:admin提交:106解决:36

返回比赛提交提交记录侧边提交

题目描述

有一天,孩子回来对我说:“妈妈,听说马尔代夫很不错,放假了我想去玩。”

马尔代夫?我也想去!没有人不向往一场说走就走的旅行!

“其实我想去的地方很多,呼伦贝尔大草原、玉龙雪山、布达拉宫、艾菲尔铁塔……”小孩子还说着他感兴趣的地方。

于是我们拿出地图,标出想去的地点,然后计算最短路线,估算大约所需的时间,有了这张秘制地图,一场说走就走的旅行不是梦!

“哇,感觉我们像凡尔纳的《环游地球八十天》,好激动!可是老妈你也太 out 了,学计算机的最短路线你用手算?”

暴汗……,“小子你别牛,你知道怎么算?”

“呃,好像是叫什么迪科斯彻的人会算。”

哈哈,关键时刻还要老妈上场了!

输入

样例组数:

t ( 0 < t <= 10 )

城市的个数:

n ( 0 < n < 100 )

城市之间的路线的个数:

m ( 0 < m < 10000 )

请输入城市之间的路线以及距离:

( 0 < ui, vi, di <= 100 )

u1 v1 d1

u2 v2 d2

...

ui vi di

请输入小明所在的位置:

l ( 0 < l < 100 )

输出

小明到各个城市的最短距离;

l1 l2 ... ln (若某城市无法达到则输出impossible)

样例输入 复制
1
5 
11 
1 5 12 
5 1 8 
1 2 16 
2 1 29 
5 2 32 
2 4 13 
4 2 27 
1 3 15 
3 1 21 
3 4 7 
4 3 19 
5
样例输出 复制
8 24 23 30 0
#include<bits/stdc++.h>
using namespace std;
const int INF=1e7;//初始化无穷大为10000000
int mp[105][105];
int dist[105],n,m;
bool flag[105];//如果flag[i]等于true,说明顶点i已经加入到集合S;否则顶点i属于集合V-S.

void Dijkstra(int u)
{
    for(int i=1;i<=n;i++)
    {
        dist[i]=mp[u][i];//初始化源点u到其他各个顶点的最短路径长度。
        flag[i]=false;
    }
    dist[u]=0;
    flag[u]=true;//初始时,集合s中只有一个元素:源点u。 
    for(int i=1;i<=n;i++)
    {
        int min=INF;
        int t=u;
        for(int j=1;j<=n;j++)//在集合V-S中寻找距离源点u最近的顶点t。 
           if(!flag[j]&&dist[j]<min)
           {
                   t=j;
                   min=dist[j];
           }
        if(t==u) 
            return;//找不到t,跳出循环。 
        flag[t]=true;//否则,将t加入集合。
        for(int j=1;j<=n;j++)//更新集合V-S中与t邻接的顶点到源点u的距离 
           if(!flag[j]&&mp[t][j]<INF)//!flag[j]表示j在V-S中 
             if(dist[j]>(dist[t]+mp[t][j]))
                 dist[j]=dist[t]+mp[t][j];
    }
} 
int main()
{
    int t;
    cin>>t;
    while(t--)
    { 
        int u,v,w,st;
        cin>>n;
        cin>>m;
        for(int i=1;i<=n;i++)
           for(int j=1;j<=n;j++)
               mp[i][j]=INF;
        while(m--)
        {
            cin>>u>>v>>w;
            mp[u][v]=min(mp[u][v],w);
        }
        cin>>st;
        Dijkstra(st);
        for(int i=1;i<=n;i++)
        {
            if(dist[i]==INF)
                   cout<<"impossible"<<" ";
        else
           cout<<dist[i]<<" ";
        }
        cout<<endl;
    }
    return 0;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迪杰斯特拉算法浅析 的相关文章

随机推荐

  • Echarts的tooltip显示自定义格式化解决方案

    前言 今天甲方爸爸提出了要求 需要把图表显示的数据保留百分数的小数点后一位 实际上这个显示的问题之前在后台处理数据的时候就处理过 当时是没有保留小数的 后来要求保留小数点后一位就在后台处理了 谁知道 在前台展示的时候 莫名的出现小数点后十几
  • 大数据分析R中泊松回归模型实例

    如果您知道如何以及何时使用泊松回归 它可能是一个非常有用的工具 在大数据分析R中泊松回归模型实例中 我们将深入研究泊松回归 它是什么以及R程序员如何在现实世界中使用它 具体来说 我们将介绍 1 泊松回归实际上是什么 什么时候应该使用它 2
  • Shell重定向 &>file、2>&1、1>&2 、/dev/null的区别

    在shell脚本中 默认情况下 总是有三个文件处于打开状态 标准输入 键盘输入 标准输出 输出到屏幕 标准错误 也是输出到屏幕 它们分别对应的文件描述符是0 1 2 gt 默认为标准输出重定向 与 1 gt 相同 2 gt 1 意思是把 标
  • 下载xlsx中的URL到指定目录

    爱情是灯 友情是影子 当灯灭了 你会发现你的周围都是影子 朋友 是在最后可以给你力量的人 import org apache poi ss usermodel import org apache poi xssf usermodel XSS
  • KVM更改虚拟机默认存储路径

    Virt默认的虚拟机存储路径是 var lib libvirt images 如下图所示 接下来我们创建一个新的存储池 用来存储新建的虚拟机 存储池的名称为vm 路径为 usr local src kvm 新的存储池已创建成功 接下来新建虚
  • 数字IC设计知识点及综合题详解(提前批、秋招必刷基础题)——(二)时序分析基础(Slack、Setup、Hold、Jitter、Skew、亚稳态)异步复位,同步释放

    目录 一 常见名词 1 1 时钟偏移Skew 1 1 1 Skew出现的原因 1 1 2 Skew解决方法 1 2 抖动Jitter 1 2 1 Jitter出现的原因 1 2 2 时钟抖动永远存在 1 3 扇入扇出Fan in Fan o
  • 【最新最详细】SQL Server 2019 安装教程

    最新最详细 SQL Server 2019 安装教程 引言 今天又双叒搞新电脑的环境 对于我这个 Net程序员 那就肯定离不开安装 SQL Server 了 网上没有找到很详细的教程 所以决定自己再写一份 下面直接进入主题 下载SQL Se
  • 基于 Matlab 的 RLS 算法进行时间序列预测

    基于 Matlab 的 RLS 算法进行时间序列预测 时间序列分析在许多领域中都具有重要的应用价值 例如金融 经济 气象等 时间序列预测是其中的一个关键问题 其目的是根据过去一段时间的观测值来预测未来一段时间的值 在本文中 我们将介绍如何使
  • Vue中安装less-loader报错处理

    Vue中使用less 需要安装less loader 1 安装命令 npm install less loader 需要注意的是less loader版本需要和webpack版本对应 版本不对会报错 webpack 4 使用 less lo
  • 【ML on Kubernetes】第 10 章:构建、部署和监控模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 从主机备份ubuntu到虚拟机的坑

    系统用的是16 04 1 备份过程 直接采用这个方法 不过我是直接用的镜像 data放在U盘 没有做成启动U盘 参考链接1 问题就来了 直接挂载镜像使用的是CD ROM 可能出现权限问题无法修改 记住要提前把必要的文件保存在虚拟机的系统下
  • Python自动化测试专栏——选择元素基本方法之CSS选择器

    CSS选择器选择元素 1 根据 tag名选择元素 选择 所有的tag名为div的元素 wd find elements by css selector div 2 根据id属性选择元素 wd find element by css sele
  • tensorflow如何更新到最新的版本

    背景 前面在anaconda中使用tensorflow时 在深度学习目标检测的那方面出现了问题 提示 no op 当你在百度上百度这个错误的时候 很多的CSDN博主会告诉你是因为你的tensorflow版本过低 准备 那就是更新tensor
  • MySQL——习题:每个部门当前员工最高薪水

    有一个员工表dept emp简况如下 有一个薪水表salaries简况如下 获取所有部门中员工薪水最高的相关信息 给出dept no emp no以及其对应的salary 按照部门编号升序排列 以上例子输出如下 解法1 SELECT d1
  • 移植Qt4.8.4项目到QT5.2上时遇到的一些问题

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题1 Qt 5 2 使用原来的QT4 8 4项目时QWebView QWebFrame等类无法编译通过 出现原因 QWebView QWebFrame QWebPage
  • OJ: 蛇形矩阵 螺旋矩阵

    题目描述 题目说明 在一个N N的方阵中 填入1 2 N共N个数 并要求构成如下的格式 N lt 10 例 输入描述 多组数据 每行读入一个N 输出描述 对应输出N N的蛇形矩阵 每个数字占3格子 每个蛇形矩阵之间用空行分割 输入样例 3
  • 【Git】git pull总是要输入账号和密码

    git config global credential helper store 之后再次执行git push 或者git pull这时候只需要在输入一次用户名和密码下次就不需要了 这个命令则是在你的本地生成一个账号密码的记录 这样就不用
  • Python中执行MySQL语句, 遇到同时有单引号, 双引号处理方式 !r, repr()

    SQL语句 insert cmd INSERT INTO 0 SET 1 format db conn firmware info table join 0 1 r format k str v for k v in info dict i
  • linux读取按行读写文本文件

    include
  • 迪杰斯特拉算法浅析

    所谓的迪杰斯特拉算法 就是一个用来求一个图中某点到其它点的最短路径的算法 大致方法 遍历所有节点 找到离起点最近的一个点 那么这个点到起点的最小距离肯定是起点到这个点的这条边的权值 然后标记这个点被使用过了 以1中的那个点为中继 更新其它节