链式前向星

一种存储图的数据结构

建立一个结构体和一个数组加一个变量,这里的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;

为链式前向星添加边

  1. ++cnt为新添加的边选择一个空变量
  2. edge[++cnt].next=head[u]代表让\(edge[cnt]\)中的\(next\)变量指向\(u\)结点的上一个边
  3. \(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算法

求最小单源路径

  1. 将源点放入队列中,并标志源点\(s\)已经在队列之中\(vis[s]=true\)
  2. 进入一个循环,当队列为空,各节点的最短路径便求出来了
  3. 从队列中取出一个结点,并更新标志,遍历该结点的边,对符合条件的各边\(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和链式前向星的更多相关文章

  1. 最短路 spfa 算法 && 链式前向星存图

    推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...

  2. [板子]SPFA算法+链式前向星实现最短路及负权最短路

    参考:https://blog.csdn.net/xunalove/article/details/70045815 有关SPFA的介绍就掠过了吧,不是很赞同一些博主说是国内某人最先提出来,Bellm ...

  3. UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

    最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...

  4. UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))

    最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...

  5. 链式前向星+SPFA

    今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...

  6. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  7. 【模板】链式前向星+spfa

    洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...

  8. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  9. SPFA + 链式前向星(详解)

    求最短路是图论中最基础的算法,最短路算法挺多,本文介绍SPFA算法. 关于其他最短路算法,请看我另一篇博客最短路算法详解 链式前向星概念 简单的说,就是存储图的一个数据结构.它是按照边来存图,而邻接矩 ...

  10. zzuli 2130: hipercijevi 链式前向星+BFS+输入输出外挂

    2130: hipercijevi Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 595  Solved: 112 SubmitStatusWeb B ...

随机推荐

  1. Linux配置系统yum源

    首先是需要你把需要使用的镜像挂载到系统上面,可以通过cd /dvd添加也可以直接上传到系统上 本文档是上传到系统上进行挂载 操作系统:Red Hat 7.6 挂载镜像:Red Hat 7.6 1.挂载 ...

  2. 使用读写分离模式扩展 Grafana Loki

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500127&idx=1&sn=995987d558 ...

  3. kvm使用桥接的方法

    什么是桥接 桥接就是把物理机的网卡模拟成交换机,虚拟机的网卡直接连在虚拟的网桥即交换机上.这样kvm虚拟机分配的IP地址,就应该和物理机在同一网段,可以对外进行服务. 在KVM下运行的VM默认的网卡采 ...

  4. 【微服务】- 服务调用 - OpenFeign

    服务调用 - OpenFeign 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 介绍 O ...

  5. .NET6 JWT(生成Token令牌)

    一.Net 6环境下的.net core项目里如何使用JWT. 第一步,在Nuget引入JWT.Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGe ...

  6. day43-反射02

    2.Class类 2.1基本介绍 Class类也是类,因此也继承Object类 Class类对象不是new出来的,而是系统创建的 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次 每个 ...

  7. 2016 ZCTF note3:一种新解法

    2016 ZCTF note3:一种新解法 最近在学习unlink做到了这道题,网上有两种做法:一种是利用edit功能读入id时整数溢出使索引为-1,一种是设置块大小为0使得写入时利用整数溢出漏洞可以 ...

  8. 垃圾回收机制GC

    垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...

  9. 【nginx】使用 nginx 时,使用 sub_filter 注入 js 代码,例如 google analysis 等

    目录 1. 创建 GA 1 2. 注入代码2 结果 网站 F12 GA 控制台 Reference 在一项工作中,已经将内网的一个网站通过 二级域名 + nginx + frp 的方式映射到公网.网站 ...

  10. prometheus监控实战

    第一节.环境和软件版本 1.1.操作系统环境 主机ip 操作系统 部署软件 备注 192.168.10.10 Centos7.9 Grafana.Pushgateway.Blackbox Export ...