SPFA和链式前向星
链式前向星
一种存储图的数据结构
建立一个结构体和一个数组加一个变量,这里的to代表边\((u,v)\)中的\(v\)结点,而\(edge\)数组的索引\(idx\)代表\(u\),其中\(w\)代表权值,\(next\)代表以\(u\)为起始点的上一个边。
\(head\)代表这个\(x\)结点在\(edge\)数组中的最后一个边的下标索引,\(cnt\)用于记录边时当\(edge\)的下标索引用。
struct {
int to, w, next;
} edge[MAX_N];
int head[MAX_N], cnt = 0;
为链式前向星添加边
++cnt为新添加的边选择一个空变量edge[++cnt].next=head[u]代表让\(edge[cnt]\)中的\(next\)变量指向\(u\)结点的上一个边- \(head[u]=cnt\)代表更新结点\(u\)的最后一条边在\(edge\)中的下标
edge[++cnt].next=head[u];
edge[cnt].w=w;
edge[cnt].to=v;
head[u]=cnt;
遍历
首先获取结点\(x\)的最后一条边,经过数据处理后,将i移向结点\(x\)的上一条边
for(int i=head[x];i;i=edge[i].next)
SPFA算法
求最小单源路径
- 将源点放入队列中,并标志源点\(s\)已经在队列之中\(vis[s]=true\)
- 进入一个循环,当队列为空,各节点的最短路径便求出来了
- 从队列中取出一个结点,并更新标志,遍历该结点的边,对符合条件的各边\(dis[edge[i].to]>dis[v]+edge[i].w\)进行松弛,然后如果符合条件的松弛边目标结点如果未在队列中,则放入,更改标志。
松弛:对于每个顶点v∈V,都设置一个属性\(d[v]\),用来描述从源点s到v的最短路径上权值的上界,称为最短路径估计。就是这个操作\(dis[edge[i].to] = dis[v] + edge[i].w;\)
queue<int> que;
que.emplace(s);
vis[s] = true;
while (!que.empty()) {
int v = que.front();
que.pop();
vis[v] = false;
for (int i = head[v]; i; i = edge[i].next) {
if (dis[v] + edge[i].w < dis[edge[i].to]) {
dis[edge[i].to] = dis[v] + edge[i].w;
if (!vis[edge[i].to]) {
que.emplace(edge[i].to);
vis[edge[i].to] = true;
}
}
}
}
求是否存在负环
如果一个图存在负环,那么其的最短路径一定会存在一个无限循环,经过负环后,路径越来越小,那么一定有一些结点,一直入队出队,判断是否有结点入队次数大于\(n\)次
queue<int> que;
que.emplace(1);
vis[1]=true,dis[1]=0;
while (!que.empty()) {
int v = que.front();
que.pop();
vis[v] = false;
fe(ver, G[v]) if (dis[ver.to] > dis[v] + ver.cost) {
dis[ver.to] = dis[v] + ver.cost;
if (!vis[ver.to]) {
if (++cnt[ver.to] >= n) {
//存在负环
}
que.emplace(ver.to);
vis[ver.to] = true;
}
}
}
SPFA和链式前向星的更多相关文章
- 最短路 spfa 算法 && 链式前向星存图
推荐博客 https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...
- [板子]SPFA算法+链式前向星实现最短路及负权最短路
参考:https://blog.csdn.net/xunalove/article/details/70045815 有关SPFA的介绍就掠过了吧,不是很赞同一些博主说是国内某人最先提出来,Bellm ...
- UESTC30-最短路-Floyd最短路、spfa+链式前向星建图
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- 链式前向星+SPFA
今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- 【模板】链式前向星+spfa
洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...
- POJ 3169 Layout(差分约束+链式前向星+SPFA)
描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
- SPFA + 链式前向星(详解)
求最短路是图论中最基础的算法,最短路算法挺多,本文介绍SPFA算法. 关于其他最短路算法,请看我另一篇博客最短路算法详解 链式前向星概念 简单的说,就是存储图的一个数据结构.它是按照边来存图,而邻接矩 ...
- zzuli 2130: hipercijevi 链式前向星+BFS+输入输出外挂
2130: hipercijevi Time Limit: 1 Sec Memory Limit: 128 MB Submit: 595 Solved: 112 SubmitStatusWeb B ...
随机推荐
- Bypass Windows Defender Dump Lsass(手法拙劣)
0x00.前言 Windows Defender是一款内置在Windows操作系统的杀毒软件程序,本文旨在记录实战环境中,服务器存在Windows Defender情况下转储凭证的渗透手法,技术简单粗 ...
- P8539 「Wdoi-2」来自地上的支援 题解
思路 根据题意,如果每次询问选中的为第 \(x\) 个数,那么前 \(x-1\) 次操作一定不会选中第 \(x\) 个数.(感觉在说废话.) 同样,因为第 \(x\) 个数必须被选中 \(k\) 次, ...
- ACL和NAT
1 ACL 1.1 ACL的作用 1).用来对数据包做访问控制(丢弃或者放弃) 2).结合其他协议,用来匹配范围 1.2 ACL的工作原理 当数据包从接口经过时,由于接口启用了ACL,此时路由器会对报 ...
- Rust变量用法与特征
变量用法与特征 变量绑定 let a = "hello world" 为何不用赋值而用绑定呢(其实你也可以称之为赋值,但是绑定的含义更清晰准确)?这里就涉及 Rust 最核心的原 ...
- JS 模块化 - 02 Common JS 模块化规范
1 Common JS 介绍 Common JS 是模块化规范之一.每个文件都是一个作用域,文件里面定义的变量/函数都是私有的,对其他模块不可见.Common JS 规范在 Node 端和浏览器端有不 ...
- 分布式安装部署MinIO
官方文档地址:http://docs.minio.org.cn/docs/master/distributed-minio-quickstart-guide 前提条件:分布式Minio至少需要4个硬盘 ...
- 第一个Django应用 - 第四部分:表单和类视图
一.表单form 为了接收用户的投票选择,我们需要在前端页面显示一个投票界面.让我们重写先前的polls/detail.html文件,代码如下: <h1>{{ question.quest ...
- 7.nexus版本升级
nexus-3.14.0升级到3.15.2 首先来看下原来的服务目录: nexus-3.14.0-04 sonatype-work 注意:nexus-3.14.0-04是应用程序包,sonatype- ...
- 13. Fluentd输出插件:in_forward用法详解
in_forward插件通常用于从其他节点接收日志事件,这些节点包括其他Fluentd实例.fluent-cat命令行或者Fluentd客户端程序.这是目前效率最高的日志事件接收方法. in_forw ...
- WPF绘制圆形调色盘
本文使用writeableBitmap类和HSB.RGB模式来绘制圆形的调色盘. 开源项目地址:https://github.com/ZhiminWei/Palette RGB为可见光波段三个颜色通道 ...