【Luogu P3371&P4779】【模板】单源最短路径(线段树优化Dijkstra)
线段树优化$\rm dijkstra$
线段树每个节点维护$[l,r]$中$dist$最小的点,删除则把该点$dist$赋值为$+\infty$,然后更新该点影响到的线段树上的其他节点即可。
可以得到“更新该节点影响到的线段树上的其他节点”部分的代码:
(线段树数组$\rm st[]$)
void pushup(int x) {
st[x] = dist[st[x << ]] < dist[st[x << | ]] ? st[x << ] : st[x << | ];
} void updata(int x, int l, int r, int q) { //更新信息
if(l != r) {
int mid = (l + r) >> ;
if(q <= mid) updata(x << , l, mid, q);
else updata(x << | , mid + , r, q);
pushup(x);
}
}
然后$\rm dijkstra$代码如下:
//此处ans为最终数组
void dijkstra(int s) {
ans[s] = dist[s] = ;
build(, , n); //建树
while(dist[st[]] < inf) {
int v = st[]; vis[v] = ; //取出最小的
for(int i = head[v]; i != -; i = edges[i].nxt) if(!vis[edges[i].to]) { //更新相邻节点
dist[edges[i].to] = min(dist[edges[i].to], dist[v] + edges[i].val);//修改dist
updata(, , n, edges[i].to);//更新所影响的节点
}
ans[v] = dist[v]; dist[v] = inf;//记录答案,删除节点
updata(, , n, v); //更新所影响的节点
}
}
完整代码:
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5 + , inf = 0x3f3f3f3f; int st[MAXN << ], head[MAXN], dist[MAXN], ans[MAXN], n, m, cnt = ;
bool vis[MAXN]; struct edge {
int to, nxt, val;
} edges[MAXN << ]; void addedge(int from, int to, int val) {
edges[cnt].to = to, edges[cnt].val = val;
edges[cnt].nxt = head[from]; head[from] = cnt++;
} void pushup(int x) {
st[x] = dist[st[x << ]] < dist[st[x << | ]] ? st[x << ] : st[x << | ];
} void build(int x, int l, int r) {
if(l < r) {
int mid = (l + r) >> ;
build(x << , l, mid);
build(x << | , mid + , r);
pushup(x);
} else st[x] = l;
} void updata(int x, int l, int r, int q) {
if(l != r) {
int mid = (l + r) >> ;
if(q <= mid) updata(x << , l, mid, q);
else updata(x << | , mid + , r, q);
pushup(x);
}
} void dijkstra(int s) {
ans[s] = dist[s] = ;
build(, , n);
while(dist[st[]] < inf) {
int v = st[]; vis[v] = ;
for(int i = head[v]; i != -; i = edges[i].nxt) if(!vis[edges[i].to]) {
dist[edges[i].to] = min(dist[edges[i].to], dist[v] + edges[i].val);
updata(, , n, edges[i].to);
}
ans[v] = dist[v]; dist[v] = inf;
updata(, , n, v);
}
} int main() {
ios::sync_with_stdio(false);
memset(dist, 0x3f, sizeof(dist));
memset(head, 0xff, sizeof(head));
memset(ans, 0x3f, sizeof(ans));
int u, v, w, s;
cin >> n >> m >> s;
for(int i = ; i < m; i++) {
cin >> u >> v >> w;
addedge(u, v, w);
}
dijkstra(s);
for(int i = ; i <= n; i++) cout << ans[i] << " ";
cout << endl;
return ;
}
【Luogu P3371&P4779】【模板】单源最短路径(线段树优化Dijkstra)的更多相关文章
- 【洛谷 p3371】模板-单源最短路径(图论)
题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...
- luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值
————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...
- 【BZOJ】BZOJ3040 最短路 线段树优化Dijkstra
题目描述 N个点,M条边的有向图,求点1到点N的最短路(保证存在). 1<=N<=1000000,1<=M<=10000000 输入格式 第一行两个整数N.M,表示点数和边数. ...
- [CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)
Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 ...
- [模板]单源最短路径(Dijkstra)
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...
- luogu P3834 【模板】可持久化线段树 1(主席树)
题解真的是越写越懒 // luogu-judger-enable-o2 #include<cstdio> #include<algorithm> using std::sort ...
- luogu 3834 【模板】可持久化线段树 1(主席树)
我这种菜鸡还是%一下棒神比较好 #include<iostream> #include<cstdio> #include<cmath> #include<cs ...
- 堆优化/zkw线段树优化 dijkstra
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 200005 ...
- Dijkstra求解单源最短路径
Dijkstra(迪杰斯特拉)单源最短路径算法 Dijkstra思想 Dijkstra是一种求单源最短路径的算法. Dijkstra仅仅适用于非负权图,但是时间复杂度十分优秀. Dijkstra算法主 ...
随机推荐
- Unicode字符集
Unicode字符集的出现是为了弥补ASCII码只能表示128个字符的限制.在实际应用中,如若我们想显示汉字或日文等等,显然使用ASCII是不可能的.Unicode占用了两个字节,即16位,能表示的字 ...
- WebAPI项目添加定时服务
开发平台: VS2019 背景: 在开发小程序的API服务的时候,由于access_token的有效期为7200秒,也就是2小时,这就需要后端定时的去更新这个access_token,便于调用小程序的 ...
- app后台管理系统框架metronic的学习笔记
先来看效果: 给出当前页面的代码: <!DOCTYPE html> <!--[if IE 8]> <html lang="zh" class=&quo ...
- linux 命令——61 wget(转)
Linux系统中的wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTPS和FTP协 ...
- Django Form 表单
Form 表单功能 生成HTML表单元素检查表单元素的合法性验证如果错误,重复显示表单数据类型转换 Form相关的对象 Widget 渲染成HTML元素的工具Field Form对象中的一个字段For ...
- 【BZOJ3720】Gty的妹子树(主席树+时间分块)
点此看题面 大致题意: 给你一棵有根树,让你支持三种操作:询问某子树中大于\(x\)的值的个数,把某一节点值改成\(x\),添加一个父节点为\(u\).权值为\(x\)的节点. 关于此题做法 此题做法 ...
- 【洛谷2279】[HNOI2003] 消防局的设立(贪心)
点此看题面 大致题意: 给你\(N\)个点(其中\(1\)号点为根),并告诉你编号为\(2\sim N\)的点的父亲(\(fa[i]<i\)),现在要在树上选择尽量少的关键点(消防局),使得任意 ...
- css img 等比例自动缩放
按父容器宽度自动缩放,并且保持图片原本的长宽比 img{ width: auto; height: auto; max-width: 100%; max-height: 100%; }
- EL和JSTL表达式学习记录
EL.JSTL表达式EL:1.EL使用目的:代替jsp页面中java脚本编写 2.EL作用:(1)从域中取出数据(最重要)(2)EL的内置对象(11个)(3)EL可以执行表达式运算 JSTL(JSP标 ...
- React后台管理系统-后台接口封装
1新建文件夹 service ,里边建4个文件,分别是statistic-service.jsx 首页数据统计接口, user-service.jsx用户接口, product-service.jsx ...