堆优化/zkw线段树优化 dijkstra
#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的更多相关文章
- dijkstra之zkw线段树优化
其实特别好理解,我们只要写一个数据结构(线段树)支持一下操作: 1.插入一个数\(x\). 2.查询当前数据结构中最小的数的插入编号. 3.删除插入编号为\(x\)的数. 第一眼看成可持久化了 其实就 ...
- 洛谷P2505||bzoj2750 [HAOI2012]道路 && zkw线段树
https://www.luogu.org/problemnew/show/P2505 https://www.lydsy.com/JudgeOnline/problem.php?id=2750 神奇 ...
- 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra
题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...
- 【Luogu P3371&P4779】【模板】单源最短路径(线段树优化Dijkstra)
线段树优化$\rm dijkstra$ 线段树每个节点维护$[l,r]$中$dist$最小的点,删除则把该点$dist$赋值为$+\infty$,然后更新该点影响到的线段树上的其他节点即可. 可以得到 ...
- 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 ...
- 【bzoj4699】树上的最短路(树剖+线段树优化建图)
题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...
- [bzoj3073] Journeys 题解(线段树优化建图)
Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建 ...
- G. 神圣的 F2 连接着我们 线段树优化建图+最短路
这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...
- B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路
B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...
随机推荐
- jmeter_图形监控
图形监控插件下载: http://jmeter-plugins.org/downloads/all/ 下载: JMeterPlugins-Standard-1.4.0 ServerAgent-2. ...
- ZFS文件系统及Freenas介绍
一.简介 1.什么是zfs文件系统 ZFS文件系统的英文名称为Zettabyte File System,也叫动态文件系统(Dynamic File System),是第一个128位文件系统.最初是由 ...
- ubuntu 18.04安装RTX 2060 显卡驱动
第一:安装ppa的显卡驱动源 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update 第二:检查显卡和推荐驱动 ubuntu- ...
- Oracle 11g安装过程工作Oracle数据库安装图解
一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: oracle.com/tec ...
- PDF时间戳 服务器
好用权威免费的PDF文件数字签名时间戳服务器URL http://tss.pki.gva.es:8318/tsa
- ubuntu ufw 配置
ubuntu ufw 配置 Ubuntu 18.04 LTS 系统中已经默认附带了 UFW 工具,如果您的系统中没有安装,可以在「终端」中执行如下命令进行安装: 1 sudo apt install ...
- 【洛谷 P3804】 【模板】后缀自动机
题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- HttpClinet工具类
一.URL调用 忽略https证书 1.调用 InputStream in = null; try { URL url = new URL( "url地址" ); IgnoreSS ...
- 【转载】C#中string类使用Remove方法来移除指定位置的字符
在C#的字符串操作过程中,有时候需要将字符串中指定位置的字符移除,此时就可能使用到字符串类string类中的Remove方法,此方法允许指定移除开始的开始的索引位置,以及移除的长度信息等,共有2个重载 ...
- PHP 结合 Bootstrap 实现学生列表以及添加学生功能实现(继上篇登录及注册功能之后)
本人是一位学生,正在学习当中,可能BUG众多,请见谅并指正,谢谢!!! 学生列表实现 HTML: <!DOCTYPE html> <html> <head> < ...