#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int MAXM = 200005;
inline void read(int &num)
{
char ch; int flag=1;
while(!isdigit(ch=getchar()))if(ch=='-')flag=-flag;
for(num=ch-'0';isdigit(ch=getchar());num=num*10+ch-'0');
}
int N, M, S; int fir[MAXN], to[MAXM], nxt[MAXM], w[MAXM], cnt;
inline void Add(int u, int v, int wt)
{
to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; w[cnt] = wt;
} int dis[MAXN];
bool vis[MAXN];
#define pii pair<int,int>
#define mp make_pair
priority_queue<pii, vector<pii>, greater<pii> >q;
inline void Dijkstra_heap(int s)
{
memset(dis, 0x3f, sizeof dis);
memset(vis, 0, sizeof vis);
dis[s] = 0; q.push(mp(0, s));
while(!q.empty())
{
int u = q.top().second; q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = fir[u]; i; i = nxt[i])
if(!vis[to[i]] && dis[to[i]] > dis[u] + w[i])
q.push(mp(dis[to[i]]=dis[u] + w[i], to[i]));
}
} int Min[MAXN<<2], hp[MAXN], bit; inline void Modify(int x) { for(x>>=1; x; x>>=1) Min[x] = (hp[Min[x<<1]] < hp[Min[x<<1|1]]) ? Min[x<<1] : Min[x<<1|1]; }
inline void Build() { for(bit = 1; bit <= N+1; bit<<=1); }
inline void Update(int x, int dist) { hp[x] = dist; Modify(bit+x); } inline void Dijkstra_segment_tree(int s)
{
memset(dis, -1, sizeof dis);
memset(hp, 0x3f, sizeof hp);
Build(); hp[s] = 0;
for(int i = 1; i <= N; i++) Min[bit+i] = i, Update(i, hp[i]);
for(int i = 1; i <= N; i++)
{
int u = Min[1];
dis[u] = hp[u];
Update(u, 0x3f3f3f3f);
for(int j = fir[u]; j; j = nxt[j])
if(dis[to[j]] == -1 && hp[to[j]] > dis[u] + w[j])
Update(to[j], dis[u] + w[j]);
}
} int main ()
{
int x, y, z, S;
read(N), read(M), read(S);
for(int i = 1; i <= M; i++)
read(x), read(y), read(z), Add(x, y, z);
Dijkstra_heap(S);
//Dijkstra_segment_tree(S);
for(int i = 1; i < N; i++) printf("%d ", dis[i]);
printf("%d\n", dis[N]);
}

CAUTION!CAUTION!注意堆优化dij不能这么写:!!!!

int dis[MAXN];
bool vis[MAXN];
struct cmp
{
bool operator ()(int a, int b) //重载优先级低的(1:a优先级低 0:b优先级低)
{
return dis[a] > dis[b]; //此处有问题
}
};
priority_queue<int, vector<int>, cmp>q;
void Dijkstra_heap(int s)
{
memset(dis, 0x7f, sizeof dis);
memset(vis, 0, sizeof vis);
dis[s] = 0; q.push(s);
while(!q.empty())
{
int u = q.top(); q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = fir[u]; i; i = nxt[i])
if(!vis[to[i]] && dis[to[i]] > dis[u] + w[i])
{
dis[to[i]] = dis[u] + w[i];
q.push(to[i]);
}
}
}

由于优先队列的有序性是取决于插入的位置,当dis值在外面被修改,队列的元素顺序不会改变,于是就失去了有序性。在luogu的最短路模板题(传送门)就会WA。不过有的数据水的还是能过许多点。

堆优化/zkw线段树优化 dijkstra的更多相关文章

  1. dijkstra之zkw线段树优化

    其实特别好理解,我们只要写一个数据结构(线段树)支持一下操作: 1.插入一个数\(x\). 2.查询当前数据结构中最小的数的插入编号. 3.删除插入编号为\(x\)的数. 第一眼看成可持久化了 其实就 ...

  2. 洛谷P2505||bzoj2750 [HAOI2012]道路 && zkw线段树

    https://www.luogu.org/problemnew/show/P2505 https://www.lydsy.com/JudgeOnline/problem.php?id=2750 神奇 ...

  3. 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra

    题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...

  4. 【Luogu P3371&P4779】【模板】单源最短路径(线段树优化Dijkstra)

    线段树优化$\rm dijkstra$ 线段树每个节点维护$[l,r]$中$dist$最小的点,删除则把该点$dist$赋值为$+\infty$,然后更新该点影响到的线段树上的其他节点即可. 可以得到 ...

  5. HDU4719-Oh My Holy FFF(DP线段树优化)

    Oh My Holy FFF Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) T ...

  6. 【bzoj4699】树上的最短路(树剖+线段树优化建图)

    题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...

  7. [bzoj3073] Journeys 题解(线段树优化建图)

    Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建 ...

  8. G. 神圣的 F2 连接着我们 线段树优化建图+最短路

    这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...

  9. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路

    B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...

随机推荐

  1. vs中web api程序不包含适合于入口点的静态“Main”方法

    步骤:选择该项目的属性--应用程序--输出类型--类库

  2. python 能做什么(常用库)

    1. 编写脚本,如测试脚本.初始化脚本.运维脚本:pywin32.nose2. 图形界面开发: Tkinter.PyQt . wxPython . PySide .Pillow3. 爬虫: Scrap ...

  3. 39 多线程(十一)——ThreadLocal

    目前阶段,我只能知其然,不能做到知其所以然,这里引用一篇其所以然的文章,为以后理解ThreadLocal做准备: https://www.cnblogs.com/ldq2016/p/9041856.h ...

  4. WAMP集成环境虚拟路径修改

    只需要改httpd.conf这一个文件就好了. 1.单击右下角wamp图标如下图打开httpd.conf,或者从文件夹打开httpd.conf.

  5. 2019/7/18ACM集训

    2019-07-18 09:15:34 这个是练习刷的题 Vus the Cossack and Numbers Vus the Cossack has nn real numbers aiai. I ...

  6. [LOJ6432] [PKUSC2018] 真实排名

    题目链接 LOJ:https://loj.ac/problem/6432 Solution 假设我们当前要算\(x\)的答案,分两种情况讨论: \(x\)没被翻倍,那么\([a_x/2,a_x]\)这 ...

  7. MVC-09安全

    部分8:添加安全. MVC应用程序安全性 Models文件夹包含表示应用程序模型的类. Visual Web Developer自动创建AccountModels.cs文件,该文件包含用于应用程序认证 ...

  8. sqlite 一些常用的句子

    有关SQLITE最完整的操作语句参考资料,应当是官方网址的http://www.sqlite.org/lang.html这个地方. select max(id)  from table  取最大id ...

  9. Hook executed successfully but returned HTTP 403

    jenkins配置gitlab的webhook,完成配置,测试结果显示 Hook executed successfully but returned HTTP 403 解决: 进入jenkins: ...

  10. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...