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

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. A - Jessica's Reading Problem POJ - 3320 尺取

    A - Jessica's Reading Problem POJ - 3320 Jessica's a very lovely girl wooed by lots of boys. Recentl ...

  2. 28. 实现 strStr()

    d地址:https://leetcode-cn.com/problems/implement-strstr/ <?php /** 实现 strStr() 函数. 给定一个 haystack 字符 ...

  3. Redis 过期时间相关命令

    命令 示例和描述 PERSIST PERSIST key-name —— 移除键的过期时间 TTL TTL key-name —— 查看给定键距离过期还有多少秒 EXPIRE EXPIRE key-n ...

  4. 【STM32项目笔记】STM32CubeMX+Keil+Proteus联合实现LED闪烁

    摘要 利用STM32CubeMx配置STM32芯片的功能,然后将配置后的内容生成代码,并导出成可以使用Keil打开编辑的文件,在Keil中添加控制代码后,下载到Proteus仿真中,使用仿真观察代码执 ...

  5. SpringCloud(三)之我学 Hystrix

    1.断路器 在消费服务的启动类,添加注解:@EnableCircuitBreaker,在消费服务的调用类上,添加注解:@HystrixCommand(fallbackMethod = "&q ...

  6. php zip打包

    zip中加入文件 <?php $zip = new ZipArchive; if ($zip->open('test.zip', ZipArchive::OVERWRITE) === TR ...

  7. app测试的一些较为重要的测试点

    安装测试 从不同的手机所自带的不同的版本的软件商城里面下载抖音并安装查看是否成功 安装后是否能正常运行安装后的文件和文件夹是否写到了指定的目录里 安装过程中取消安装,安装的文件是否在指定的目录里 安装 ...

  8. Nginx-高性能的反向代理服务器

    Nginx Nginx作为一款反向代理服务器,现在大多数网站都有使用,自己在项目中几乎都有用到,自己的网站也使用到了它. 了解Nginx 上面图可以直观的看出Nginx的用处,可以将请求转发至Web服 ...

  9. C++ memset函数用法

    #include<stdio.h>#include<string.h>int main(){ char buffer[] = "I love you!"; ...

  10. python3(五) if

    age = 20 if age >= 18: print('your age is', age) print('adult') # 如果if语句判断是True,就把缩进的两行print语句执行了 ...