朴素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. Web--TypeConverter

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. Servlet部署项目和项目起别名

    一.部署项目: ① 单机MyEclipse导航栏下方Deploy MyEclipse J2EE Project to Server... ②单机Add,选择Service,点击Ok 二.给项目起别名: ...

  3. 【转】python中的闭包详细解析

    一.什么是闭包? 如果一个内嵌函数访问外部嵌套函数作用域的变量,并返回这个函数,则这个函数就是闭包 闭包必须满足三个条件: 1. 必须有一个内嵌函数    2. 内嵌函数必须引用外部嵌套函数中的变量  ...

  4. LeetCode 680. Valid Palindrome II(双指针)

    题意:给定一个字符串,可以最多去掉一个字符,判断是否可以使该字符串成为一个回文串. 分析:head和tail双指针分别指向字符串首尾,如果s[head] != s[tail],则要么去掉s[head] ...

  5. CF1285D Dr. Evil Underscores

    挂个链接 Description: 给你 \(n\) 个数 \(a_1,a_2,--,a_n\) ,让你找出一个 \(x\) ,使 \(x\) 分别异或每一个数后得到的 \(n\) 个结果的最大值最小 ...

  6. vue-mixin

    当多个组件需要处理同一个问题,并且处理该问题的逻辑又相似,非常推荐用mixin

  7. Codeforces1307C. Cow and Message

    读题,我们知道选1个.选2个的时候是没有冲突的,大于2个的时候就有限制,那么我们观察是否可以把大于2个的情况都转换一下,可以发现,如果有一个串的长度大于2,且出现的次数大于2,那么,组成这个串里必定有 ...

  8. 「CH6202」黑暗城堡

    「CH6202」黑暗城堡 传送门 这道题是要让我们求以点 \(1\) 为源点的最短路树的方案数. 我们先跑一遍最短路,然后考虑类似 \(\text{Prim}\) 的过程. 当我们把点 \(x\) 加 ...

  9. 设计模式课程 设计模式精讲 20-2 解释器模式coding

    1 代码演练 1.1 代码演练1(解释器模式coding) 1.2 代码演练如何应用了解释器模式 1 代码演练 1.1 代码演练1(解释器模式coding)(该案例运用了栈的先进先出的特性) 需求: ...

  10. Lamda表达式学习笔记一

    Lamda表达式学习笔记一 一.Lamda语法诠释 三傻大闹宝莱坞的主人公兰彻说的一句话让我映像深刻:用简单的语言来表达同样的意 我并不是说书上的定义怎么怎么不对,而是应该理解书本上的定义,并用简单的 ...