【洛谷】P4779 单源最短路径(标准版+弱化版) Dijkstra堆优化

题目背景
2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路。

然后呢?

100 \rightarrow 60100→60;

\text{Ag} \rightarrow \text{Cu}Ag→Cu;

最终,他因此没能与理想的大学达成契约。

小 F 衷心祝愿大家不再重蹈覆辙。

题目描述
给定一个 nn 个点,mm 条有向边的带非负权图,请你计算从 ss 出发,到每个点的距离。

数据保证你能从 ss 出发到任意点。

输入格式
第一行为三个正整数 n, m, sn,m,s。 第二行起 mm 行,每行三个非负整数 u_i, v_i, w_iu
i

,v
i

,w
i

,表示从 u_iu
i

到 v_iv
i

有一条权值为 w_iw
i

的有向边。

输出格式
输出一行 nn 个空格分隔的非负整数,表示 ss 到每个点的距离。

输入输出样例
输入 #1复制
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出 #1复制
0 2 4 3
说明/提示
样例解释请参考 数据随机的模板题。

1 \leq n \leq 10^51≤n≤10
5

1 \leq m \leq 2\times 10^51≤m≤2×10
5

s = 1s=1;

1 \leq u_i, v_i\leq n1≤u
i

,v
i

≤n;

0 \leq w_i \leq 10 ^ 90≤w
i

≤10
9
,

0 \leq \sum w_i \leq 10 ^ 90≤∑w
i

≤10
9

本题数据可能会持续更新,但不会重测,望周知。

思路(堆优化):

标准版和弱化版就输出语句略微不同,放一块讲了。
一开始我用了我十分喜欢的SPFA算法,发现超时。一开始恨不能理解,但是想到SPFA算法并不稳定,最坏情况仍能到O(n²)的量级。不论怎么优化,加入速读速写,仍无法避免TL。

SPFA(超时代码)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 500000+500
using namespace std;
long long  static inf = (1<<31)-1;
long long static Inf = 1e15;
typedef long long ll;
vector<pair<ll,ll> > D[maxn];
ll d[maxn];
ll vis[maxn];
ll k,n,m;
void init()
{
   
        for(ll i=1;i<=n;i++)
        D[i].clear();
        for(ll i=1;i<=n;i++)
        d[i] = Inf;
        for(ll i=1;i<=n;i++)
        vis[i] = 0;
}

void SPFA()
{
   
        queue<ll>  q;
        d[k] = 0;
        vis[k] = 1

你可能感兴趣的:(最短路径,队列,洛谷)