许久没有写博客,更新一下~

Dijkstra两种典型写法

1. 朴素Dijkstra     时间复杂度O(N^2)       适用:稠密图(点较少,分布密集)

#include <cstdio>
#include <iostream>
#include <cstring> using namespace std;
const int N=;
int n, m;
int g[N][N], dist[N];
bool st[N]; int dijkstra()
{
memset(dist, 0x3f, sizeof(dist));
dist[]=;
for(int i=; i<n; i++)
{
int t=-;
for(int j=; j<=n; j++)
if(!st[j] && (t==- || dist[t]>dist[j])) t=j; //1. S中求最近的点,目前到起点的最小值
st[t]=true; //2. 更新状态 t点到起点的最短路已经被确定
for(int j=; j<=n; j++)
dist[j]=min(dist[j], dist[t]+g[t][j]); //3. 用t更新,经过t可能构成的最短路
}
if(dist[n]==0x3f3f3f3f) return -;
else return dist[n];
} int main()
{
scanf("%d%d", &n, &m);
memset(g, 0x3f, sizeof(g));
for(int i=; i<m; i++)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
g[x][y]=min(g[x][y], z);
}
printf("%d\n", dijkstra());
return ;
}

2. 堆优化Dijkstra  时间复杂度:O(m*log(n))   适合:稀疏图(边较多,点分布不集中)

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring> using namespace std;
const int N=1e5+;
typedef pair<int, int> PII;
int h[N], e[N], ne[N], w[N], idx;
bool st[N];
int n, m, dist[N]; void add(int a, int b, int c)
{
e[idx]=b, ne[idx]=h[a], w[idx]=c, h[a]=idx++; //建图
} int dijkstra()
{
memset(dist, 0x3f, sizeof(dist));
dist[]=;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({, });
while(heap.size())
{
auto u=heap.top(); //取已确定到起点最小距离的点, O(1)
heap.pop();
int ver=u.second, dis=u.first;
if(st[ver]) continue;
st[ver]=true;
for(int i=h[ver]; i!=-; i=ne[i])
{
int j=e[i];
if(!st[j] && dist[j]>dis+w[i]) //这里的dis可以写成dist[ver]
{ //用pair存储距离、节点编号,为了以 距离 建堆
dist[j]=dist[ver]+w[i]; //注意这里的w[i] , 边的权值存储在节点对应位置
heap.push({dist[j], j}); //入堆,O(log(n))
} //每一条边都会被遍历到,总时间复杂度O(m*log(n))
}
}
if(dist[n]==0x3f3f3f3f) return -;
else return dist[n];
} int main()
{
scanf("%d%d", &n, &m);
memset(h, -, sizeof(h));
while(m--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
}
printf("%d\n", dijkstra()); return ;
}

单源最短路问题--朴素Dijkstra & 堆优化Dijkstra的更多相关文章

  1. luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  2. 【Luogu P3371&P4779】【模板】单源最短路径(线段树优化Dijkstra)

    线段树优化$\rm dijkstra$ 线段树每个节点维护$[l,r]$中$dist$最小的点,删除则把该点$dist$赋值为$+\infty$,然后更新该点影响到的线段树上的其他节点即可. 可以得到 ...

  3. hdu 2544 单源最短路问题 dijkstra+堆优化模板

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. 洛谷 P3371 【模板】单源最短路径(堆优化dijkstra)

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

  5. 深入理解dijkstra+堆优化

    深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...

  6. 堆优化 dijkstra 简介

    dijkstra 前言 原本我真的不会什么 dijkstra 只用那已死的 spfa ,还有各种玄学优化,可是,我不能相信一个已死的算法,就像我不能相信自己. ps : 虽然他已经活了 序 我站在镜子 ...

  7. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  8. 配对堆优化Dijkstra算法小记

    关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...

  9. 堆优化dijkstra

    单源最短路径 题目链接:https://www.luogu.org/problemnew/show/P4779 直到做了这个题才发现我之前写的堆优化dijkstra一直是错的.. 这个堆优化其实很容易 ...

随机推荐

  1. 如何基于layui的laytpl实现数据绑定

    想了半天才想起自己园子的登录密码.可想而知,多长时间没登录了 正文一开始用layui做了几个管理系统,所以用起来觉得确实很容易上手,管理后台最常用的就是form和table以及弹窗类.layui提供的 ...

  2. wsl中配置SML环境

    配置SML/NJ #安装 sudo apt install smlnj #但是wsl不支持32位程序,所以需要下面配置 sudo dpkg --add-architecture i386 sudo a ...

  3. .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

    1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  4. 使用systemctl工具

                           使用systemctl工具 8.1问题 本例要求掌握systemctl控制工具的基本操作,完成下列任务: 重启httpd.crond.bluetooth服 ...

  5. 谈谈CSS3中display属性的Flex布局(弹性布局)

    最近为了微信小程序,回忆起之前有接触过的弹性布局(display:Flex) 网上摘录的原文地址:https://www.cnblogs.com/xuyuntao/articles/6391728.h ...

  6. 计算机网络协议,IPV4数据报分析

    一.IP数据报结构分析 1.整体结构 一个IP数据报由首部和数据两部分组成. 首部的前一部分固定长20字节,这是所有IP数据报必须具有的:在首部的固定部分后面是一些可选字段,其长度是可变的. IP数据 ...

  7. 22 Extends 继承(子类、父类)

    本章主要介绍继承的 概念.方法重写(@Override注解的使用).使用场景.方法的执行顺序 /*1.继承的 概念 * 继承:多个类有共同的成员变量和成员方法,抽取到另外一个类中(父类),在让多个类去 ...

  8. VirtualBox的四种网络连接方式【转】

    VirtualBox中有4中网络连接方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种,其实他跟VMWare 的网络连接方式都是 ...

  9. 安装python3.8和python2.7

    在同一台电脑上同时安装Python2和Python3 目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3, ...

  10. 三个步骤就能让你轻松掌握Python爬虫

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:NicePython PS:如有需要Python学习资料的小伙伴可以加 ...