朴素dijkstra时间复杂度$O(n^{2})$,通过使用堆来优化松弛过程可以使时间复杂度降到O((m+n)logn);dijkstra不能用于有负权边的情况,此时应使用SPFA,两者写法相似。

朴素dijk:

 int dist[maxn];//距离
int g[maxn][maxn];//邻接矩阵存图
bool vis[maxn];//是否访问过
void dijk(int v){//起点v
memset(dist, 0x3f,sizeof dist);
dist[v]=;
for(int i=;i<n;i++)
{
int t=-;
for(int j=;j<=n;j++)
if(!vis[j]&&(t==-||dist[t]>dist[j]))
t=j;
vis[t]=true;
for(int j=;j<=n;j++)
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
}

堆优化的dijk:(练习题 洛谷P4479

 vector<pair<int,int> > g[maxn];//距离,点标
int dist[maxn];
bool vis[maxn];
void dijk(int v){
memset(dist,0x3f,sizeof(dist));
dist[v]=;
priority_queue<pair<int,int> >pq;//距离,点标
pq.push({-dist[v],v});//默认大的优先,故取负数使小的优先,也可自定义结构体
while(!pq.empty()){
int t=pq.top().second;
pq.pop();
if(vis[t]) continue;
vis[t]=true;
for(int i=; i<g[t].size(); i++){
if(dist[g[t][i].second]>dist[t]+g[t][i].first){
dist[g[t][i].second]=dist[t]+g[t][i].first;
pq.push({-dist[g[t][i].second],g[t][i].second});
}
}
}
}

SPFA:(练习题:蓝桥杯ALGO-5

1.开一个队列,起点入队,距离初始化为无穷

2.若队列不空

  1)每次取出队首进行松弛操作

  2)若需要更新则更新,同时判断连接点是否在队列中,若不在则入队

  3)(可选)记录入队次数,判断是否有负环

 vector<pair<int,int> > g[maxn];//点标,距离
int dist[maxn];
bool inq[maxn];
void spfa(int s){
memset(dist,0x3f,sizeof(dist));
queue<int> q;
q.push(s);
inq[s]=;
dist[s]=;
while(!q.empty()){
int t=q.front();
q.pop();
inq[t]=false;
for(int i=; i<g[t].size(); ++i){
int to=g[t][i].first;
if(dist[to]>dist[t]+g[t][i].second){
dist[to]=dist[t]+g[t][i].second;
if(inq[to]) continue;
inq[to]=true;
q.push(to);
}
}
}
}

SPFA和堆优化的Dijk的更多相关文章

  1. 复习最短路 spfa+dijstra堆优化

    题目很简单,, 但是wa了三次,, 用<vector>之前一定要记得clear()...简单说下 spfa的问题 和bell_forman有点类似 每次取出一个点 然后更新 并把更新了的节 ...

  2. 最短路模板[spfa][dijkstra+堆优化][floyd]

    借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <alg ...

  3. dij+堆优化

    写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个: 香甜的奶油: #include<iostream> #include<cstdio> #include<cs ...

  4. [CF1146D]Frog Jumping_exgcd_堆优化dij

    Frog Jumping 题目链接:http://codeforces.com/contest/1146/problem/D 数据范围:略. 题解: 首先发现,如果$x\ge a +b$,那么所有的$ ...

  5. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  6. 最短路模板|堆优化Dijkstra,SPFA,floyd

    Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...

  7. POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)

    昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...

  8. [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))

    传送门 蒟蒻我原本还想着跑两边spfa,发现不行,就gg了. 首先这道题卡spfa,所以需要用堆优化的dijkstra求出最短路径 因为题目中说了,保证最短路径有且只有一条,所以可以通过dfs求出最短 ...

  9. 堆优化的Dijkstra

    SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...

随机推荐

  1. Django-ORM的F查询和Q查询

    当一般的查询语句已经无法满足我们的需求时,Django为我们提供了F和Q复杂查询语句.假设场景一:老板说对数据库中所有的商品,在原价格的基础上涨价10元,你该怎么做?场景二:我要查询一个名字叫xxx, ...

  2. [经验] 如何在虚拟机上安装 CentOS

    环境配置 虚拟机 vmware 15.5 Pro 操作系统 CentOS-7-x86_64-DVD-1908.iso 第一步: 在虚拟机上打开操作系统的镜像文件并配置硬件信息 这里的操作就是一本道  ...

  3. OpenTSDB 写入数据

    1. 关于 Metrics, value, tag name, tag value opentsdb的每个时间序列必须有一个metric和一个或多个tag对,每个时间序列每小时的数据保存一行.open ...

  4. 解决RStudio(非conda安装)在使用Anaconda中的R环境时,缺失“ libbz2-1.dll ”而不能正常启动问题

    1.问题描述 当非conda安装的RStudio,在调用Anaconda中的R环境时,报如下错误: 2.解决办法 下载同版本的R,对Anaconda中R相应的文件进行替换(图标中标注的部分) R3.5 ...

  5. Newtonsoft.Json 版本不一致导致错误

    可以在配置文件添加这部分,其他版本的不一致,也可使用这种方式解决. <runtime> <assemblyBinding xmlns="urn:schemas-micros ...

  6. php 低版本不能使用php 命令,创建软链接

      ln -s /usr/local/php5/bin/php /usr/bin/php php 低版本不能使用php 命令,创建软链接   phpize 依赖于 phpcli 模式 所以php命令必 ...

  7. php 基础知识 post 和get 两种传输方式的区别

    1.post更安全(不会作为url的一部分,不会被缓存.保存在服务器日志.以及浏览器浏览记录中) 2.post发送的数据量更大(get有url长度限制) 3.post能发送更多的数据类型(get只能发 ...

  8. AT指令之 TCP/IP 命令

    BC26 还有一组专用于 TCP 通信的 AT 指令:<BC26_TCP/IP_AT_Commands_Manual_V1.1>,之前已经有了 Socket 可以进行 TCP 通信,现在又 ...

  9. Pandas 性能优化 学习笔记

    摘要 本文介绍了使用 Pandas 进行数据挖掘时常用的加速技巧. 实验环境 import numpy as np import pandas as pd print(np.__version__) ...

  10. map中entrySet和KeySet的区别