再会迪杰斯特拉(Dijkstra)

迪杰斯特拉算法

算法说明

迪杰斯特拉算法用来求解某一个起点到以其他所有点为终点的最短路径长度;

算法思路-贪心算法

以下图为例

image

  • 指定一个节点(即起点),例如计算“A”到其他节点的最短路径;
  • 引入两个集合(S,U),S集合包含所有已经求出其最短路径的点(以及其最短长度),U集合包括未求出的最短路径的点;
    所有和起点A直接相连的节点更新其与A的距离为路径长度,没有直接相连的设置为+∞;

  • 从U集合中找出距离起点s路径最短的点,加入S集合,例如第一步最小的为A->D,距离为2;
  • 更新U集合路径,if(A->D+D->(B、C、E))(B、C、E),就更新U;

  • 重复执行横线内两步,直到所有的节点都被加到了集合U中;

下面使用迪杰斯特拉算法处理上图

①选取起点为A,首先刷新所有和A点直接通过边相连的点,即B、D点,将A->D置为2,A->B置为4,其他A->C,A->E均为正无穷

算法代码

#include <stdio.h>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <cstring>
#include <string.h>
#include <stdlib.h>
#define N 100005
#define INF 2147483647
typedef long long ll;
using namespace std;
typedef struct Edge {ll to;ll wei;Edge() {to=-1;wei=INF;//初始都为不可达状态}
} E;
ll n,M,s;
vector<E>m[N];	//邻接表
bool wh[N];	//集合U和S,true代表节点已经放入S,false表示还在U集合
ll dis[N];	//存放起点到节点的最短距离 
ll cnt;		//S集合元素个数
void Dijkstra(int s)
{wh[s]=true;cnt++;while (cnt!=n) {int Min=INF,Minindex=-1;//开始找S集合中距离s最近的节点for (int i=1; i<=n; i++) {if (!wh[i]&&(dis[i]<Min)) {Min=dis[i];Minindex=i;}}//此时找到了最小的边//将此节点放到S集合wh[Minindex]=true;cnt++;//更新U集合路径for (int i=0; i<m[Minindex].size(); i++) {dis[m[Minindex][i].to]=min(m[Minindex][i].wei+dis[Minindex],dis[m[Minindex][i].to]);}}
}
int main()
{cin>>n>>M>>s;for (int i=1; i<=n; i++) {if(i==s) {dis[s]=0;} else {dis[i]=INF;}}ll f,t,w;for (ll i=1; i<=M; i++) {	//存储图 cin>>f>>t>>w;int flag=0;//有向图,不双向 for (int j=0; j<m[f].size(); j++) {	//重边 if (m[f][j].to==t) {m[f][j].wei=min(w,m[f][j].wei);flag=1;break;}}if (flag==0) {E e;e.to=t;e.wei=w;m[f].push_back(e);}}//找到和起点直接相连的节点,设置和起点直接相连的距离for (int i=0; i<m[s].size(); i++) {dis[m[s][i].to]=m[s][i].wei;}Dijkstra(s);for (int i=1; i<=n; i++) {if (i==s) {(i==1)?cout<<0:cout<<" "<<0;continue;}(i==1)?cout<<dis[i]:cout<<" "<<dis[i];}
}

上述算法即是最朴素的迪杰斯特拉算法,需要注意的是,算法考虑了顶点有重边的情况,这是洛谷的题目要求的,题目链接:
P3371 【模板】单源最短路径(弱化版)

但对于没有优化的迪杰斯特拉算法,题目的强化版就会直接TLE,分析朴素的Dijkstra算法,我们发现可以优化的点有:

  • 每次寻找U集合中dis中最小的元素时使用了遍历的方法,但我们可以使用小顶堆保证每次直接弹出最小的值,不需要再去遍历;

对于优先队列,使用stl库的priority_queue实现。

迪杰斯特拉算法的优缺点

  • 优点
    • 算法思路简单,比较容易上手使用;
    • 经典的最短路算法,适合大多数场景;
  • 缺点
    • 时间复杂度和其他算法相比不太理想,适用于节点n不太多的情况;
    • 不能处理存在总花费为负值且从源点S可达的环路的图,因为显然无限兜圈子花费会越来越小;
    • 事实上,存在负环的情况是抓住了贪心算法的弱点导致问题不能解决;

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

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

相关文章

数字孪生等前沿技术,将如何解码未来交通?

来源&#xff1a;物联网智库目前&#xff0c;国内在交通领域的技术创新层出不穷&#xff0c;交通出行领域已经成为创新科技聚集和爆发的领域。众多新科技的出现&#xff0c;正在给我们描绘出一幅未来交通的蓝图。在面向未来的诸多关于智慧交通的前沿应用和解决方案中&#xff0…

神经网络-反向传播

反向传播 反向传播---->训练参数&#xff0c;在所有参数上使用梯度下降。使NN模型在训练数据上的损失函数最小。损失函数&#xff08;loss&#xff09;&#xff1a;预测值&#xff08;y&#xff09;与已知答案&#xff08;y_&#xff09;的差距。均方误差MSE&#xff1a;, …

第七章 二叉搜索树(b3)BST:删除

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10247191.html

2021天梯赛题解

2021程序设计天梯赛在4月24日举办&#xff0c;本文是天梯赛的部分题解&#xff0c;有的问题在当时也没有得到满分&#xff0c;由于学校开启了天梯赛的重现比赛&#xff0c;再写一写。 注意&#xff1a;本文答案不是标准答案&#xff0c;每道题收获的分数写在了相应位置&#x…

python-scrapy爬虫框架

scrapy爬虫框架 1.Scrapy爬虫框架 scrapy 不是一个函数功能库&#xff0c;而是一个爬虫框架。scrapy爬虫框架&#xff1a; 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合。.简单说爬虫框架是一个半成品&#xff0c;能够帮助用户实现专业网络爬虫。scrapy爬虫框架共包含…

如何正确地运用人工智能模型?

来源&#xff1a;内容摘自《模型思维&#xff1a;简化世界的人工智能模型&#xff08;全彩&#xff09;》模型&#xff0c;是客观事物的简化表示&#xff01;历史上&#xff0c;每一个伟大模型的提出&#xff0c;都极大地推动了科学和社会的发展&#xff0c;比如历史上出现的3个…

讲解Linux数据库安装

学习了linux这门课之后&#xff0c;就开始实践过程了&#xff0c;这样比较记得牢固&#xff0c;学以致用。 有了基本的命令&#xff0c;就可以试着安装数据库了。 企业环境需要安装VMWare ESXi虚拟机&#xff0c;然后再在里面新建虚拟机。 镜像vmware-viclient-all-5.1.0-10641…

张钹院士:制约人工智能发展的最大困难是什么?

出品&#xff1a;新基建访谈采访&#xff1a;张楠整理&#xff1a;广胜脑科学被誉为自然科学研究的“终极疆域”&#xff0c;脑科学的发展不仅直接关系人类对于意识诞生机制的探索&#xff0c;也对推动当前 AI 技术发展具有重要意义。对于脑科学目前的发展现状、面临的难题、与…

《新一代城市大脑建设与发展》专家研讨会在京举办(新版)

&#xff08;这个新版本增加了三位专家的发言&#xff09;2021年6月26日&#xff0c;新一代城市大脑建设与发展专家研讨会在京举办&#xff0c;本次活动由城市大脑全球标准研究组主办&#xff0c;远望智库承办。6G 俱乐部提供了重要支持。20多位专家参与本次研讨会&#xff0c;…

排序算法-查找算法

排序算法 冒泡排序 从左向右扫描数据&#xff0c;选着最大的数据。要点&#xff1a;比较相邻的两个数&#xff0c;如果左边的数大于右边的数就进行交换。 template<class T> void BubbleSort(T *array, const int length) { for (int i 0; i <length-1; i) { fo…

当法律纽带变成“机器红线”,能让自动驾驶汽车更安全吗?

来源&#xff1a; 脑极体美国汽车协会(American Automobile Association, AAA)与哈佛大学的一项研究结果显示&#xff0c;高达77%的人表示担心自己与自动驾驶汽车共享道路的安全性&#xff0c;62%则担心自动驾驶汽车发生意外时的肇责归属。某种程度上来讲&#xff0c;这可以说是…

李联宁|量子计算机:技术路线、风险及战略投资

来源&#xff1a;《学术前沿》杂志2021年4月上&#xff08;微信有删节&#xff09;作者&#xff1a;西安交通大学城市学院教授 李联宁原文责编&#xff1a;桂琰新媒体责编&#xff1a;李思琪视觉&#xff1a;王洋图片来源&#xff1a;网络由于现有半导体微电子技术物理极限的原…

vs code 配置java

VS code 入门 Vs code 配置Java 首先到VS code官网下载VS code软件&#xff0c;打开界面如图&#xff1a; 下载安装好&#xff0c;打开界面如图(注下图已汉化)&#xff1a; 为了便于使用&#xff0c;我们先进行汉化&#xff0c;在最左边点击图1-1中的图标&#xff0c;出现如图…

四、HTTP控制器

1、控制器的作用&#xff1a;数据和视图之间的桥梁 2、控制器创建方法&#xff1a; &#xff08;1&#xff09;手动创建 <?php namespace App\Http\Controllers; class UserController extends Controller { public function showProfile($id) { return view(user.profile,…

机器人行业专利构建与维护刻不容缓,专利研发需下苦功!

来源&#xff1a;机器人大讲堂自我国加入世界贸易组织&#xff0c;已经近20年过去。但不可忽视的是&#xff0c;发达国家或地区利用其产业先发优势&#xff0c;也一直在知识产权和专利上&#xff0c;采用知识产权和专利贸易壁垒&#xff0c;限制我国企业参与国际市场竞争。机器…

java-弹簧布局(自适应窗口)

一、布局管理器 弹簧布局管理器以容器和组件的边缘为操作对象&#xff0c;通过组件与容器边缘以及组件与组件边缘建立约束(建立位置关系)&#xff0c;实现对组件的布局管理。主要通过函数putConstraint(Strting s1,Component c1,int len,Strting s2,Component c2);当s2在s1的北…

从1G到5G,从回顾过去到展望未来

来源&#xff1a;《从1G到5G&#xff1a;移动通信如何改变世界》 作者&#xff1a;王建宙始于20世纪80年代的蜂窝式移动通信&#xff0c;只用了30多年的时间&#xff0c;就实现了在全世界的普及。如今&#xff0c;手机是人们随身携带的使用频率最高的工具。手机改变了人类的沟…