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 ...
随机推荐
- Docker_删除所有容器
删除所有容器 docker rm `docker ps -aq`
- 从零开始搭建gitea代码管理平台
Gitea,一款极易搭建的Git自助服务.如其名,Git with a cup of tea.跨平台的开源服务,支持Linux.Windows.macOS和ARM平台.配置要求低,甚至可以运行在树莓派 ...
- C++ "链链"不忘@必有回响之单链表
1. 前言 数组和链表是数据结构的基石,是逻辑上可描述.物理结构真实存在的具体数据结构.其它的数据结构往往在此基础上赋予不同的数据操作语义,如栈先进后出,队列先进先出-- 数组中的所有数据存储在一片连 ...
- Mybatis 一级缓存和二级缓存原理区别 (图文详解)
Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen Mybatis缓存 缓存就是内存中的数据,常常来自对数据库查询结 ...
- 【项目实战】pytorch实现逻辑斯蒂回归
视频指导:https://www.bilibili.com/video/BV1Y7411d7Ys?p=6 一些数据集 在pytorch框架下,里面面有配套的数据集,pytorch里面有一个torchv ...
- fastdfs-zyc管理FastDFS的web界面
俩压缩包根据大小重命名以下,按图片所示 把1_fastdfs-zyc.7z重命名为fastdfs-zyc.7z.001 把2_fastdfs-zyc.7z重命名为fastdfs-zyc.7z.002 ...
- k8s更换网络插件:从flannel更换成calico
卸载flannel 查看已安装的flannel的信息 # 查看CNI插件,可以得知使用的是flannel # cat /etc/cni/net.d/10-flannel.conflist { &quo ...
- MySQL集群搭建(2)-主主从模式
1 环境准备 上次我们搭建了主备架构,如下所示 这次我们的搭建目标是 具体配置信息 IP 系统 端口 MySQL版本 节点 读写 说明 192.168.41.83 Centos6.8 3306 5.7 ...
- linux主机时间同步
yum -y install ntpdate ntp && ntpdate cn.pool.ntp.org systemctl start ntpd.service && ...
- SpringBoot课程学习(一)
@SpringBootTest指定测试的启动类 声明@SpringBootTest @Test注解 @Test 指定测试方法 @Order排序 一:先声明排序模式 @TestMethodOrder(M ...