优先队列优化迪杰斯特拉

∙\bullet∙在最朴素的迪杰斯特拉中,我们每次都要跑一层循环来找到最小的 d[i]d[ i ]d[i](d[i]d[ i ]d[i]代表起点到iii这个点的最小距离)然后再更新与iii点有边相连的没有被走过的点jjj的d[j]d[j]d[j]

void dij(int start)
{d[start]=0;for(int i=1;i<=n;i++){int minpos=-1;for(int j=1;j<=n;j++){if((vis[j]==0)&&(minpos<0||d[j]<d[minpos]))minpos=j;}vis[minpos]=1;if(d[minpos]==inf)break;for(int i=head[minpos];i!=-1;i=edge[i].next)if(d[minpos]+edge[i].val<d[edge[i].to])d[edge[i].to]=d[minpos]+edge[i].val;}
}

∙\bullet∙优先队列优化就是省去了跑一层循环来找到最小的 d[i]d[ i ]d[i]
首先需要一个结构体,这个结构体的作用就相当于数组d[i]d[ i ]d[i]的作用,结构体里的ididid=数组下标iii,结构体里的ddd=d[i]d[i]d[i],就是换了一种形式表示,但是原始的 d[i]d[ i ]d[i]数组还是要保留的,因为它存的是每个点到起点的最小距离。然后再用一个优先队列,优先队列里面装的是disdisdis结构体,因为优先队列是要对里面的元素进行自动排序,并且排序要用到&lt;&lt;<号,所以在结构体里重载了小于号,我写的这个重载小于号就代表ddd小的值放在优先队列的前端,大的值放在后端。
重载完了以后就只需要将以disdisdis为类型的结构体加入队列,每次取出队首元素就找到了最小的 d[i]d[ i ]d[i]。

struct dis
{int id,d;dis(int id,int d):id(id),d(d){}bool operator < (const dis &a)const//重载小于号{return d>a.d;}
};priority_queue<dis>q;

输入n,mn,mn,m,nnn代表几个点(编号从0开始),mmm代表几条边,接下来mmm行输入a,b,ca,b,ca,b,c,代表a,ba,ba,b之间有一条边,权值ccc,再输入s,ts,ts,t,分别代表起点和终点,问起点到终点的最短距离是多少,如果不存在最短距离,输出-1。下面贴出完整的代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<iostream>
#include<queue>
#include<string>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn = 2e4+10;
int d[maxn],n,m,vis[maxn];
int s,t;
struct dis
{int id,d;dis(int id,int d):id(id),d(d){}bool operator < (const dis &a)const{return d>a.d;}
};priority_queue<dis>q;struct node{int to,val,next;}e[maxn];//链式向前星存图
int head[maxn],cnt=0;
void add(int s,int E,int val)
{e[++cnt]={E,val,head[s]};head[s]=cnt;
}int  dij(int start)
{int flag=0;q.push(dis(start,0));d[start]=0;while(!q.empty()){dis a=q.top();q.pop();//取出最小点int now=a.id,minval=a.d;vis[now]=1;for(int i=head[now];i!=-1;i=e[i].next){int to=e[i].to,val=e[i].val;if(!vis[to]&&minval+val<d[to]){d[to]=minval+val;q.push(dis(to,d[to]));}}}if(d[t]!=inf)return d[t];else return -1;
}void init()
{for(int i=1;i<=n;i++)d[i]=inf;memset(head,-1,sizeof(head));memset(e,0,sizeof(e));memset(vis,0,sizeof(vis));while(!q.empty())q.pop();cnt=0;
}int main()
{while(scanf("%d%d",&n,&m)!=EOF){init();for(int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);a++;b++;add(a,b,c);add(b,a,c);}scanf("%d%d",&s,&t);s++;t++;printf("%d\n",dij(s));}return 0;
}

优先队列优化迪杰斯特拉相关推荐

  1. HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题

    题目 题解思路 知道是最短路,怎么建图呢? 一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 ). 翻了翻 大佬的博客 大佬定义了一种 ...

  2. LeetCode 1976. 到达目的地的方案数(迪杰斯特拉 Python 优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路. 输入保证你可以从任意路口出发到达其他任意路口,且任 ...

  3. 迪杰斯特拉算法及其堆优化

    迪杰斯特拉算法及其堆优化 迪杰斯特拉算法是一种求解图的单点最短路径的算法. 一句话来说就是找最近点,更新相邻距离,再找最近点,更新相邻距离 迪杰斯特拉算法的原理是 1.首先在没有中间节点的情况下,也就 ...

  4. usaco Sweet Butter(迪杰斯特拉(优先队列优化),bellman_ford算法模板)

    这题开始用没有优化的迪杰斯特拉喜闻乐见的超时了,然后我用bellmanford算法按理说时间复杂度更大但是书上说往往只要很短的时间就可以求出最短路. 所以我用了这个算法但是我对这个算法还是不熟套了模板 ...

  5. dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...

  6. dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...

    算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u, ...

  7. Poj 2387 Til the Cows Come Home 迪杰斯特拉(普通+优化)

    Til the Cows Come Home 迪杰斯特拉(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回来. 农场主约翰的田里有n( ...

  8. 【迪杰斯特拉的优化】 洛谷4779板子题

    P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 最终,他 ...

  9. 堆优化版迪杰斯特拉算法

    先是朴素版的迪杰斯特拉算法 存储结构为邻接矩阵 int dijstra(int n) {for (int i = 1; i <= n; i++){dist[1] = 0;int index = ...

  10. 迪杰斯特拉算法优化(dijkstra)

    dijkstra常规实现方式:迪杰斯特拉算法(dijkstra)https://blog.csdn.net/weixin_48898946/article/details/120990493 这里主要 ...

最新文章

  1. 写的函数符号表里没有_你有没有想过,C语言 main 函数到底为啥这么写?
  2. pytorch focalloss多分类 单分类
  3. python脚本 监控MySQL slave 状态
  4. 搜狗拼音输入法新加词库的基本使用
  5. js修改地址栏url_在gulp、create-react-app中css,js中的文件路径
  6. 网络应用程序设计模式
  7. .net 面试题系列文章一(附答案)
  8. 使用Spring Security和jdbc的Spring Boot
  9. 一、Vue基础语法学习笔记系列——插值操作(Mustache语法、v-once、v-html、v-text、v-pre、v-cloak)、绑定属性v-bind(绑定class、style)、计算属性
  10. 零基础 Amazon Web Services (AWS) 入门教程图文版(一)
  11. java实现户籍管理系统_基于jsp的户籍管理系统-JavaEE实现户籍管理系统 - java项目源码...
  12. 怎么在当前文件目录下打开CMD
  13. 2018-07-03 根据Excel后缀名获取WorkBook
  14. bind9 dlz mysql_利用BIND+DLZ+MYSQL构建企业智能DNS
  15. Python编程从入门到实践 第一部分基础知识 代码合集
  16. 国外物联网平台大盘点
  17. FME校园培训南京站
  18. 4-八爪鱼boss直聘信息采集
  19. JavaScript原型详解(通俗易懂)
  20. 2022年智源社区年度热点推荐丨新春集锦

热门文章

  1. 重磅长文!先进院李骁健等人:在体神经界面技术的发展-从小到大规模记录
  2. 如何使用计算机打勾,如何用电脑在方框里面打勾
  3. 初学数据分析(一)【利用numpy实现矩阵标准化】
  4. 歌声合成理论教程(1)
  5. [TJOI2019]唱、跳、rap和篮球
  6. c语言 英文歌曲大赛,英文歌曲大赛活动方案
  7. 外贸管理软件之出口流程整理丨汇信外贸软件
  8. 油藏弹性存储量计算公式_各类油藏采收率计算公式
  9. KICAD——手动生成嘉立创可识别的BOM和POS文件
  10. 正则入门 掌握字符组和量词