线段树优化$\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)的更多相关文章

  1. 【洛谷 p3371】模板-单源最短路径(图论)

    题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...

  2. luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值

    ————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...

  3. 【BZOJ】BZOJ3040 最短路 线段树优化Dijkstra

    题目描述 N个点,M条边的有向图,求点1到点N的最短路(保证存在). 1<=N<=1000000,1<=M<=10000000 输入格式 第一行两个整数N.M,表示点数和边数. ...

  4. [CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)

    Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 ...

  5. [模板]单源最短路径(Dijkstra)

    如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...

  6. luogu P3834 【模板】可持久化线段树 1(主席树)

    题解真的是越写越懒 // luogu-judger-enable-o2 #include<cstdio> #include<algorithm> using std::sort ...

  7. luogu 3834 【模板】可持久化线段树 1(主席树)

    我这种菜鸡还是%一下棒神比较好 #include<iostream> #include<cstdio> #include<cmath> #include<cs ...

  8. 堆优化/zkw线段树优化 dijkstra

    #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 200005 ...

  9. Dijkstra求解单源最短路径

    Dijkstra(迪杰斯特拉)单源最短路径算法 Dijkstra思想 Dijkstra是一种求单源最短路径的算法. Dijkstra仅仅适用于非负权图,但是时间复杂度十分优秀. Dijkstra算法主 ...

随机推荐

  1. WPF:鼠标长时间无操作,窗口隐藏

    //设置鼠标长时间无操作计时器 private System.Timers.Timer MouseTimerTick = new System.Timers.Timer(10000); private ...

  2. freebsd开启root远程登陆

    i /etc/ssh/sshd_config 找到: #PermitRootLogin no改在: PermitRootLogin yes

  3. 数据库SQL优化大总结之 百万级数据库优化方案2

      网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后, ...

  4. graylog日志收集过程举例

    graylog的日志收集功与logslash类似,也是需要input-filter-output这样一个过程. 下面举三种最常用的日志记录来说明一下.     1,TCP报文日志         设置 ...

  5. 访问FTP站点下载文件,提示“当前的安全设置不允许从该位置下载文件”的解决方案

    访问FTP站点下载文件,提示“当前的安全设置不允许从该位置下载文件”的解决方案: 打开客戶端浏览器--工具---internet-安全-自定义级别-选择到低到中低. 然后点受信任站点,把你要访问的站点 ...

  6. POJ 3233 Matrix Power Series (矩阵分块,递推)

    矩阵乘法是可以分块的,而且幂的和也是具有线性的. 不难得到 Si = Si-1+A*Ai-1,Ai = A*Ai-1.然后矩阵快速幂就可以了. /*************************** ...

  7. Softmax回归(Softmax Regression

    多分类问题 在一个多分类问题中,因变量y有k个取值,即.例如在邮件分类问题中,我们要把邮件分为垃圾邮件.个人邮件.工作邮件3类,目标值y是一个有3个取值的离散值.这是一个多分类问题,二分类模型在这里不 ...

  8. 使用U盘引导安装CentOS

    一.制作linux引导盘 1. 格式化U盘:格式成FAT32格式 2. 安装syslinux https://www.kernel.org/pub/linux/utils/boot/syslinux/ ...

  9. 导航条(Navbar)

    1.添加.navbar-fixed-top类可以让导航条固定的页面的顶部,固定的导航条会遮住页面上其它的内容,除非给body元素设置padding,导航条默认高度为50px ,因此可以给body元素设 ...

  10. Linux MySQL 修改密码

    修改root本地登录密码 修改root默认的密码(方法一)1. 启动mysql之后systemctl start mysqld.service2. 修改mysql的配置文件 vi /etc/my.cn ...