朴素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. centos610最小安装之后 后续设置

    1.网络配置 centos选择最小桌面(如果不用到类似Oracle需要用到桌面的软件,则操作系统安装最小化安装)安装之后 查看网络配置如下: 截图显示网络并未启用. 2.开启网络设置 cd /etc/ ...

  2. Ajax案例

      展示页面jsp: <%@ page language="java" contentType="text/html; charset=utf-8" pa ...

  3. How2J学习java-1、环境配置

    JDK环境变量配置分下载,配置,验证三个步骤. 一.首先需要到JDK下载网站下载所需的JDK版本可根据更新来定.主流的开发工具Idear下载. 1.首先看配置成功后的效果 点WIN键->运行(或 ...

  4. Python之字符(2)

    1.string.issupper()表示判断字符是否全部为小写字母. string1 = "abcdef" string2 = "ABCdef" string ...

  5. 遍历pd.Series的index和value的方法

    以下内容来自链接:https://blog.csdn.net/qq_42648305/article/details/89634186 遍历pd.Series的index和value的方法如下,pyt ...

  6. ubuntu修改pip的官方源为豆瓣源

    修改官方源为豆瓣源: 编辑配置文件, 如果没有, 新建一份(我这里没有): mkdir ~/.pipvim ~/.pip/pip.conf 添加内容如下: [global] index-url = h ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:缩写

    <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 缩写</title> <lin ...

  8. python随机函数.2020.2.26

    随机生成函数: import random  //首先要引用random模板 print(random.randint(0,9))     //random的语法 random.randint(0,9 ...

  9. #P1099 树网的核 题解

    题目描述 pdf 题解 这一题,刚开始看题目感觉好像很难,题目又长……一看数据范围,呵呵. 已经给出来这是个DAG,所以不用担心连通性的问题.那么怎么做呢? 朴素的做法是把树的直径的两个端点都统计出来 ...

  10. Windows Android SDK下载安装,配置,异常问题解决教程

    团队编程项目终于开始了,相信大家都在如火如荼的准备的当中,这里念半整理了一份还比较全面的关于 Android SDK的下载安装的教程,当然如果你说你们小组的实验环境选择的是Android studio ...