线段树优化$\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. 创建一个自己的GitHub,创建自己的开源项目

    作者是一个大学在读学生,自己在平时的学习中,GitHub上的开源项目给自己提供了很大的帮助.GitHub是目前使用最广泛的分布式项目管理软件,GitHub上面托管了许多非常优秀的开源项目.我觉得每一个 ...

  2. ArcGIS API for JavaScript开发初探——基础知识

    1.前言 在ArcGIS Web API开发体系中一共有四大类,分别为: ArcGIS API for Flex ArcGIS API for JavaScript ArcGIS API for RE ...

  3. 如何使用VS将项目生成一个安装包?

    VS2010项目的部署与安装winform程序,我想进行安装.1.在解决方案中 ——点击右键——添加 2.然后选择 安装和部署 ——安装向导 可以更改名称 3.点击 下一步 4.然后选择上那3个 5. ...

  4. spring mvc 的理解

    1.Spring MVC是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基 ...

  5. python 学习实例(cmdMD链接)

    实例1:大学网络排名爬取 https://www.zybuluo.com/myles/note/714347

  6. 在MVC中加载view(点开链接)的方式

    主要有: Html.ActionLink Html.RenderPartial Html.RenderAction Html.Partial AJAX.ActionLink load 浏览器对象模型 ...

  7. BZOJ 3878: [Ahoi2014]奇怪的计算器

    BZOJ 3878: [Ahoi2014]奇怪的计算器 标签(空格分隔): OI-BZOJ OI-线段树 Time Limit: 10 Sec Memory Limit: 256 MB Descrip ...

  8. IE中iframe跨域访问

    http://blog.csdn.net/ghsau/article/details/13747943

  9. python实现二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  10. javaweb基础(27)_jsp标签库实例

    一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...