【luogu P3371 单源最短路径 】 模板 SPFA优化
无优化:500ms
deque优化:400ms
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 550000;
const int inf = 0x7fffffff;
int dis[maxn], n, m, s;
bool vis[maxn];
deque<int> q;
struct edge{
int len, to, from, next;
}e[maxn<<2];
int cnt, head[maxn];
void add(int u, int v, int w)
{
e[++cnt].from = u;
e[cnt].len = w;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
void SPFA()
{
while(!q.empty())
{
int now = q.front(); q.pop_front();
vis[now] = 0;
for(int i = head[now]; i != -1; i = e[i].next)
{
if(dis[e[i].to] > dis[now] + e[i].len)
{
dis[e[i].to] = dis[now] + e[i].len;
if(!vis[e[i].to])
{
vis[e[i].to] = 1;
if(q.empty()||dis[e[i].to] > dis[q.front()])
q.push_back(e[i].to);
else
q.push_front(e[i].to);
}
}
}
}
}
int main()
{
memset(head, -1, sizeof(head));
scanf("%d%d%d",&n,&m,&s);
for(int i = 1; i <= n; i++)
dis[i] = inf;
for(int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
vis[s] = 1;
dis[s] = 0;
q.push_back(s);
SPFA();
for(int i = 1; i <= n; i++)
printf("%d ",dis[i]);
return 0;
}
priority_queue优化:300ms
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const ll maxn = 200000 + 10;
const ll inf = 2147483647;
inline ll read()
{
ll k=0,f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')f=-1;
c=getchar();
}
while(isdigit(c))
{
k=(k<<1)+(k<<3)+c-48;
c=getchar();
}
return k*f;
}
ll n, m, k, s, end, dis[maxn];
bool vis[maxn];
struct edge{
ll from, len, to, next;
}e[maxn<<2];
ll head[maxn], cnt = 0;
struct cmp{
bool operator ()(int &x, int &y)
{
return dis[x] > dis[y];
}
};
priority_queue<int, vector<int>, cmp> q;
void add(ll u, ll v, ll w)
{
e[++cnt].from = u;
e[cnt].to = v;
e[cnt].len = w;
e[cnt].next = head[u];
head[u] = cnt;
}
void SPFA()
{
//memset(dis, 127, sizeof(dis));
memset(vis, 0, sizeof(vis));
q.push(s);
dis[s] = 0;
vis[s] = 1;
while(!q.empty())
{
int now = q.top(); q.pop();
vis[now] = 0;
for(ll i = head[now]; i != -1; i = e[i].next)
{
if(dis[e[i].to] > dis[now] + e[i].len)
{
dis[e[i].to] = dis[now] + e[i].len;
if(vis[e[i].to] == 0)
{
vis[e[i].to] = 1;
q.push(e[i].to);
}
}
}
}
}
int main()
{
memset(head, -1, sizeof(head));
n = read(); m = read(); s = read();
for(int i = 1; i <= n; i++) dis[i] = inf;
for(ll i = 1; i <= m; i++)
{
ll u, v, w;
u = read(); v = read(); w = read();
add(u, v, w);
}
SPFA();
for(int i = 1; i <= n; i++)
printf("%lld ",dis[i]);
return 0;
}
【luogu P3371 单源最短路径 】 模板 SPFA优化的更多相关文章
- SPFA板子 (背景:Luogu P3371 单源最短路径)
Luogu P3371 单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数 ...
- 【luogu P3371 单源最短路径】 模板 SPFA
题目链接:https://www.luogu.org/problemnew/show/P3371 我永远都喜欢Flyod.dijkstra + heap.SPFA #include <cstdi ...
- 【luogu P3371 单源最短路径】 模板 dij + heap
题目链接:https://www.luogu.org/problemnew/show/P3371#sub 堆优化迪杰斯特拉,留着以后复习用 #include <iostream> #inc ...
- 洛谷P3371单源最短路径Dijkstra堆优化版及优先队列杂谈
其实堆优化版极其的简单,只要知道之前的Dijkstra怎么做,那么堆优化版就完全没有问题了. 在做之前,我们要先学会优先队列,来完成堆的任务,下面盘点了几种堆的表示方式. priority_queue ...
- luogu p3371 单源最短路径(dijkstral
本来我写的对的 我就多手写了个 ios::sync_with_stdio(false); 我程序里面用了cin 还有scanf 本来想偷偷懒 我就说 我查了半天错 根本找不到的啊... 后来交了几次 ...
- [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)
单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...
- 【luogu P3371 单源最短路】 模板 vector+SPFA
stl真是好,,偷懒少写邻接表,, 两个STL应用使代码简短了很多.然而还是那句话,天上不会掉馅饼,程序的效率还是有所下降的.然而,效率不是全部,人们宁可牺牲三倍效率用Java而不用C语言就是最好的例 ...
- 洛谷P3371单源最短路径SPFA算法
SPFA同样是一种基于贪心的算法,看过之前一篇blog的读者应该可以发现,SPFA和堆优化版的Dijkstra如此的相似,没错,但SPFA有一优点是Dijkstra没有的,就是它可以处理负边的情况. ...
- P3371 单源最短路径【模板】 洛谷
https://www.luogu.org/problem/show?pid=3371 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含 ...
随机推荐
- Oracle命令整理
1 常用命令 常用命令 1 sqlplus scott/tiger@192.168.47.10:1521/orcl 后面不要加: sqlplus sys/oracle as sysdb ...
- nyoj 61——传纸条(一)——————【双线dp】
传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- mysql根据某个字段分组根据更新时间获取最新的记录
我现在有一种统计表,要根据一个字段分组然后根据更新时间,每个分组获取最新的一条记录.命名感觉挺简单的一个需求,然而没什么思路,当然是问度娘了. 度娘的答案很统一,然而都不管用,都是报错的,不知道是不是 ...
- 经典算法详解(1)斐波那契数列的n项
斐波那契数列是一个常识性的知识,它指的是这样的一个数列,它的第一项是1,第二项是1,后面每一项都是它前面两项的和,如:1,1,2,3,5,8,13,21,34,55,89,144,233…… 说明:由 ...
- C++程序设计基础(8)main函数
注:读<程序员面试笔记>笔记总结 1.知识点 (2)main函数的形式 //first type int main() //second type int main(int argc,ch ...
- VMware装Linux系统全屏问题
在VMware上出装Linux,有强迫症的患者总是无法接受它不能全屏的问题,当然网上也有该问题的解决方案,但是搜索出来的答案总是零零散散,让很多初学者望而却步!今天笔者根据自己的机遇总结一遍最完备的解 ...
- Hashtable(哈希表)
简体字繁体字转化: class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); ; i < ...
- 学习总结(一)java web连接池
大家都知道,在访问数据库时要与数据库建立连接.在jdbc中,用户与数据库建立连接后,取完数据或操作完数据后,就会断开这个连接.当下次还要访问数据库时,就会重新创建连接.这样很浪费资源,尤其是网页上有数 ...
- Spring MVC+Fastjson之时间类型序列化
时间类型序列化: 注意红色代码,必须引入fastjson的JSONField类,而非其它. import com.alibaba.fastjson.annotation.JSONField; @Ent ...
- HTML标签 链接 随笔3
4-1 <a>标签 网页链接 使用<a>标签可实现超链接,它在网页制作中可以说是无处不在,只要有链接的地方,就会有这个标签. 语法: <a href="目标网 ...