迪杰斯特拉算法+链式前向星+堆优化

2023-11-01

目录

 

一、基础

二、使用链式前向星+每次遍历的第一次优化

前向星:

链式前向星:

1、结构

2、存储边

3、遍历

第一次优化代码 

三、堆优化

主要思想:

数据类型:

四、完整代码


一、基础

直接用邻接矩阵,每次遍历查找来进行操作

void dijkstra()
{
    //初始化
    //dist 
    //vis[]存储是否标记
    for(int i=1;i<=n;i++){
        dist[i]=inf;//先将所有的dist置为inf
        vis[i]=false;//将所有点都置为未标记状态
    }
    dist[beg]=0;//起始点为dist值为0
    for(int i=1;i<n;i++){
        int k=-1;
        int Min=inf;
        for(int i=1;i<=n;i++){//每次遍历找出此时未被标记且最小的dist对应的点
            if(!vis[i]&&dist[i]<Min){
                Min=dist[i];
                k=i;
            }
        }
        if(k==-1){//如果找完了跳出即可
            break;
        }
        vis[k]=true;//这个点标记
        for(int i=1;i<=n;i++){//通过找出的这个点进行松弛操作
            if(!vis[i]&&dist[k]+cost[k][i]<dist[i]){
                dist[i]=dist[k]+cost[k][i];
            }
        }
    }
}

二、使用链式前向星+每次遍历的第一次优化

讲解过多次依然经常忘……希望这是我最后一次搜它

前向星:

将输入的边排序:先按起点序号顺序排序,若起点相同,再按终点序号顺序排列

链式前向星:

不需要对边进行排序,直接存储,节省了排序时间

1、结构

1、结构体数组edge[i],用来存储第i条边;

struct edge{
    int next;//下一条边的存储位置,edge[i].next表示与第i条边同起点的下一条边的存储位置,
    int to;//该边的终点
    int w;//该边的权值
};

2、head[i]数组用来存储以i为起点的第一条边在edge中的下标;head数组一般初始化为-1

 

2、存储边

void add(int u,int v,int w){
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}

3、遍历

for(int i=head[u];1!=0;i=edge[i].next)

第一次优化代码 

void dijkstra()
{
    for(int i=1;i<=n;i++){
        dist[i]=inf;
        vis[i]=false;
    }
    dist[1]=0;
    for(int i=1;i<n;i++){
        int k=-1;
        int Min=inf;
        for(int i=1;i<=n;i++){
            if(!vis[i]&&dist[i]<Min){
                Min=dist[i];
                k=i;
            }
        }
        if(k==-1){
            break;
        }
        vis[k]=true;
        //只是这儿有所变动
        //邻接表,读取以k开头的每条边
        for(int i=head[k];i!=-1;i=edges[i].next){       
            int to=edges[i].v;
            if(!vis[to]&&dist[k]+edges[i].w<dist[to]){
                dist[to]=dist[k]+edges[i].w;
            }
        }
    }
}

三、堆优化

主要思想:

使用一个优先队列来代替最短距离的查找,因为优先队列每次弹出的元素一定是整个队列中的最大元素。

数据类型:

priority_queue<pair<int,int> >q;

四、完整代码

#include <iostream>
#include<cstring>
#include<queue>
#include<cstdio>

using namespace std;

typedef long long ll;
const int inf=0x3f3f3f3f;

struct EDGE{
    int next;//下一条边的存储位置
    int to;//该边的终点
    int w;//该边的权值
}edge[10005];

int cnt;
int n,m;
bool visit[1005];
int dist[1005];
int head[10005];

void add(int u,int v,int w){
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}

void dijkstra(){
    priority_queue<pair<int,int> > q;
    for(int i=1;i<=n;i++){
        dist[i]=inf;
        visit[i]=false;
    }
    dist[1]=0;
    q.push(make_pair(0,1));// 赋值<0,1> 代表 顶点1,距离为0
    while(!q.empty()){
        pair<int,int> t;
        t=q.top();
        q.pop();
        int u=t.second;  // u为该条路径的终点
        visit[u]=true;
        for(int j=head[u];j!=-1;j=edge[j].next){
            int v=edge[j].to;
            if(visit[v])
                continue;
            if(dist[v]>dist[u]+edge[j].w){
                dist[v]=dist[u]+edge[j].w;
                q.push(make_pair(dist[v]*(-1),v));//默认优先级比较从大到小,所以乘-1
            }
        }

    }
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0&&m==0)
            break;
        memset(head,-1,sizeof(head));
        cnt=0;
        int u,v,w;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        dijkstra();
        printf("%d\n",dist[n]);
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迪杰斯特拉算法+链式前向星+堆优化 的相关文章

  • JavaWebMyBatis中文写入数据库变问号解决方式

    首先感谢大佬给我思路 有同学也会这样 在学习javaweb时中文插入数据库变成了问号 如果你没用框架 那就在链接数据库的url后面加上 characterEncoding utf8 useUnicode true即可 具体可参考这篇文章 如
  • 16瓶药水一瓶有毒,去小白鼠测试哪一瓶水有毒?

    16瓶药水一瓶有毒 去小白鼠测试哪一瓶水有毒 面试的时候有个面试官问我 有16瓶药水 其中一瓶有毒 一只小白鼠喝过之后 一天之后会死亡 要求在少于15只小白鼠的情况下判断出哪一瓶有毒 药水可以兑在一起 小白鼠也可以喝多瓶药水 我在面试的时候
  • Filter——实现权限拦截

    创建Login jsp success jsp error jsp login jsp
  • DAPP开发初探

    前言 最近DAPP的开发貌似很火 学习了区块链的一些知识之后 相信有很多人和我一样 也想了解开发一个DAPP是一个怎样的流程 下面将通过一个简单的栗子来初识一下DAPP的开发流程 届时 我们也将开发出第一个DAPP应用 永存的留言 在线体验
  • OSG第三方库编译之十八:FBX安装(Windows、Linux、Macos环境下安装)

    目录 1 FBX介绍 2 FBX下载 3 Windows下安装 4 Linux下安装 5 MacOS下安装 1 FBX介绍 FBX是Autodesk公司出品的一款用于跨平台的免费三维创作与交换格式的软件 通过FBX用户能访问大多数三维供应商
  • JavaScript 绘制柱状图

    JavaScript 绘制柱状图 index html文件
  • linux下的串口设备管理器,在Linux下用minicom管理串口设备

    因为近期要在外地建立一个网站的发布机房 设备有 防火墙 交换机 负载均衡器 DELL2950 1950服务器 存储设备等 设备都在外地 又没有远程over IP的KVM 所以想利用DELL服务器的 远程管理卡 对服务器进行 带外管理 接着用
  • Git GitHub管理代码

    准备工作 注册一个GitHub账号 电脑安装Git软件 新建仓库 上传代码 进入GitHub网页 登录 新建一个repositoty 只用填写仓库名字 不要勾选Initialize this repository with a README
  • 基于SpringBoot+Vue的家具网站设计与实现

    博主介绍 大家好 我是一名在Java圈混迹十余年的程序员 精通Java编程语言 同时也熟练掌握微信小程序 Python和Android等技术 能够为大家提供全方位的技术支持和交流 我擅长在JavaWeb SSH SSM SpringBoot
  • NACHI机械臂后台SOCKET通讯

    NACHI机械臂后台SOCKET通讯 将机械臂做为服务器 电脑作为客户端 通讯程序在机械臂后台运行 我是先在电脑上写好 导入机械臂文件夹中 转化成机器人语言 再在用户任务这里开启它的任务号码 端口号设置为10030 代码 TCP IP So
  • nginx之配置proxy_set_header

    nginx之配置proxy set header win10客户端请求web服务 win10的ip 192 168 223 1 nginx作为反向代理服务器 192 168 223 136 nginx作为后端web服务器 192 168 2

随机推荐

  • 伦敦金天天实时行情走势图

    伦敦金天天的走势图走势图中都有交易的机会 但高质量的交易信号和进场时机不是经常出现 如果能够过滤掉不佳的交易信号 大家的投资绩效就有望大幅提升 在每天的实时行情走势图中 长影线K线是高胜率的信号 它代表金价拒绝上涨或下跌 伦敦金在实时行情走
  • Spring异步Async和事务Transactional注解

    Spring开发中我们我们常常用到 Transaction和 Async 但这2个注解加在一起很多的开发者不敢用 担心事务不生效 下面我们就仔细讲解一下这2个注解同时运用 文章用3个场景讲述它们之间的运用 相信看完本篇文章你就能灵活运用这2
  • Redis集群详解

    Redis集群详解 Redis有三种集群模式 分别是 主从模式 Sentinel模式 Cluster模式 三种集群模式各有特点 关于Redis介绍可以参考这里 NoSQL 二 Redis Redis官网 https redis io 最新版
  • 基类(父类)private 定义的变量,子类可以使用吗

    基类 父类 private 定义的变量 子类是可以使用的 private变量是传给子类了的但是不可以直接使用 需要我们去用基类里面的函数去初始化或修改继承给子类的private变量 就这样就可以调用private变量了
  • 【camera】【ISP】Lens Shading Correction镜头阴影校正

    ISP LSC 镜头阴影校正 参考 https zhuanlan zhihu com p 389334269 https blog csdn net xiaoyouck article details 77206505 https www
  • MariaDB在Linux环境下的安装及使用

    本操作适合Debain ubuntu和deepin等 此处安装的环境为deepin V23 一 查看是否已安装MariaDB mysql V 二 安装命令 sudo apt get install mariadb server 三 修改配置
  • 第一课:LabView2015中文版安装教程

    1 下载解压缩 双击文件 2015LV WinChn exe 将 点击unzip解压 解压路径为默认为 C National Instruments Downloads LabVIEW Chinese 2015 2 软件成功解压后 自动弹出
  • 了解开发手机的各项参数之显示屏

    现在android手机越来越便宜了 所以开发的话用的最多的还是真机 作为一个程序员 如果拿着手机却在百度找手机的参数 这可不太好 所以 让我们从程序员的角度来了解一下手机显示屏的参数 public class MainActivity ex
  • 云服务器物理机配置,物理机服务器怎么配置

    物理机服务器怎么配置 内容精选 换一换 对于不同的硬件设备 通过在BIOS中设置一些高级选项 可以有效提升服务器性能 服务器上的SMMU一般用来完成设备的地址转换 并且可以实现设备隔离 在虚拟化中很实用 但是在物理机测试场景下 SMMU可能
  • 关于部署vue项目在Linux上的两种方式tomcat以及nignx(3)使用nignx进行部署

    阿丹有话说 前两篇文章主要讲解了将vue中tomcat部署研究了 解决了在后台代码中通过过滤器来解决跨域问题 后期会继续出在tomcat中的代理配置等 本篇文章来将vue项目部署在nignx上 并且通过反向代理来解决跨域请求以及请求转发 使
  • Qt自绘圆盘图控件

    本人使用QPainter自绘了一个圆盘图 下面这张图片为效果图 图片中的所有 圆 刻度线 字体 均为自绘 没有使用图片 使用方法 在Ui中拖拽一个widget控件 然后右键点击该widget控件 选择提升 话不多说 直接上代码 头文件qdi
  • 数字图像处理-基于Matlab水果识别系统(图片识别)

    文件大小 25M 代码行数 315行 主程序 开发环境 Matlab2016a 下载地址 该源码均通过亲自测试可正常运行 简要概述 图像识别主要是研究用计算机代替人去处理大量的物理信息 从而帮助人们建华劳动 机械分类耗时段的特点很符合水果的
  • 【译】用 Rust 实现 csv 解析-part1

    Rust and CSV parsing 译文 用 Rust 实现 csv 解析 part1 原文链接 https blog burntsushi net csv 原文作者 BurntSushi 译文来自 https github com
  • OSPF实验及配置---超详细

    什么是OSPF 开放式最短路径优先OSPF Open Shortest Path First 是IETF组织开发的一个基于链路状态的内部网关协议 Interior Gateway Protocol 目前针对IPv4协议使用的是OSPF Ve
  • 【改进算法】混合鲸鱼WOA和BAT算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文献 1 概述 文献来源 鲸鱼优化算法 whale op
  • 接口测试开发之:Python3,订单并发性能实战

    小屌丝 鱼哥 我想写一个接口订单并发性能 能不能给我讲一下 小鱼 接口订单并发 我前篇文章不是写过常见并发框架 然后你在追加一个创建订单和生成订单不就可以了 小屌丝 鱼哥 你说的可轻松 那你能不能来一个 小鱼 好吧 那我就以我某个项目为例
  • open cvBrisk特征检测与匹配

    什么是BRISK算法 BRISK算法是2011年ICCV上 BRISK Binary Robust Invariant Scalable Keypoints 文章中 提出来的一种特征提取算法 也是一种二进制的特征描述算子 它具有较好的旋转不
  • CentOS 7下安装pptp服务

    一 检查是否支持PPTP 1 在安装之前查看系统是否支持PPTP modprobe ppp compress 18 echo success 应该输出 success 2 是否开启TUN TAP cat dev net tun 应该输出 c
  • Js中读取、移除属性及隐藏组件方法研究

    添加 移除组件属性方法 class名 attr 属性名 属性值 设置指定属性 class名 attr 属性名 读取指定属性值 or document getElementById id值 getAttribute 属性名 class名 re
  • 迪杰斯特拉算法+链式前向星+堆优化

    目录 一 基础 二 使用链式前向星 每次遍历的第一次优化 前向星 链式前向星 1 结构 2 存储边 3 遍历 第一次优化代码 三 堆优化 主要思想 数据类型 四 完整代码 一 基础 直接用邻接矩阵 每次遍历查找来进行操作 void dijk