SPFA和堆优化的Dijk
朴素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的更多相关文章
- 复习最短路 spfa+dijstra堆优化
题目很简单,, 但是wa了三次,, 用<vector>之前一定要记得clear()...简单说下 spfa的问题 和bell_forman有点类似 每次取出一个点 然后更新 并把更新了的节 ...
- 最短路模板[spfa][dijkstra+堆优化][floyd]
借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <alg ...
- dij+堆优化
写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个: 香甜的奶油: #include<iostream> #include<cstdio> #include<cs ...
- [CF1146D]Frog Jumping_exgcd_堆优化dij
Frog Jumping 题目链接:http://codeforces.com/contest/1146/problem/D 数据范围:略. 题解: 首先发现,如果$x\ge a +b$,那么所有的$ ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 最短路模板|堆优化Dijkstra,SPFA,floyd
Ⅰ:Dijkstra单源点最短路 1.1Dijkstra const int MAX_N = 10000; const int MAX_M = 100000; const int inf = 0x3f ...
- POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)
昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...
- [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))
传送门 蒟蒻我原本还想着跑两边spfa,发现不行,就gg了. 首先这道题卡spfa,所以需要用堆优化的dijkstra求出最短路径 因为题目中说了,保证最短路径有且只有一条,所以可以通过dfs求出最短 ...
- 堆优化的Dijkstra
SPFA在求最短路时不是万能的.在稠密图时用堆优化的dijkstra更加高效: typedef pair<int,int> pii; priority_queue<pii, vect ...
随机推荐
- 在Windows上使用Docker运行.NET COE应用
在Windows上使用Docker运行.NET COE应用 执行步骤: 1:安装Docker For Windows(注意:docker for windows-64位Windows 10.必须开启 ...
- mysql update 修改多个字段and的语法问题
在MySQL里面update一条记录,语法都正确的,但记录并没有被更新... 问题语句 执行之前的记录是这样的: 执行之后的记录是这样的: 可以看到,实际上是有效果的: why? 看起来,语法是完全没 ...
- C++11常用特性介绍——左值引用、右值引用
一.左值.右值 1)左值:可以放在赋值号左侧.可以被赋值的值:左值必须要在内存中有实体. 2)右值:必须放在赋值号右侧.取出值赋值给其它变量:右值可以在内存中也可以在CPU寄存器中. 二.引用 引用是 ...
- Day11 - F - A Dangerous Maze LightOJ - 1027
求期望注意期望的定义,这题我们可以分正负数情况,设所求期望为E 正数: 1/n*x_i 负数:1/n*(E+x_j) 此时概率为1/n,根据期望定义,他回到起点后出去的期望为E,花费回起点的时间为x_ ...
- Community Cloud零基础学习(一)启用以及简单配置
本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/communities https://trailhead.salesfo ...
- Coursera 国内无法登陆问题
参考: 1.Coursera登不上去 | 知乎 2.Win10如何修改hosts | 百度经验 浏览器在访问https://www.coursera.org时,出现正在等待 d3njjcbhbojbo ...
- scrapy-redis分布式
scrapy是python界出名的一个爬虫框架,提取结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 虽然scrapy 能做的事情很多,但是要做到大规模的分 ...
- idea 构建maven web项目
参考:https://blog.csdn.net/czc9309/article/details/80304074 idea Tomcat 部署 war和war exploded的区别 参考: ht ...
- C++启动和关闭外部exe
转载:https://www.cnblogs.com/Sketch-liu/p/7277130.html 1.WinExec( lpCmdLine: LPCSTR; {文件名和参数; 如没指定路径会 ...
- redis小功能大用处-bitmaps