SPFA例题

article/2025/10/23 15:30:11

引入

SPFA的核心思想是优化dist[a]=min(dist[a],dist[b]+w)这个式子;

不难想到,如果我们想要优化dist[a],那么只能从dist[b]+w这个式子转移过来;

也就是说,只有dist[b]变小了,才有可能优化dist[a]


即只有一个点被更新过后,我们才拿这个点更新其他点;

基于这个思想,我们来实现SPFA;

注意

带有负边权的图只能用SPFA

时间复杂度

一般为 O ( k E ) , k 是 常 数 O(kE),k是常数 O(kE)k

最坏情况下是 O ( V E ) O(VE) O(VE)

例题

SPFA求最短路

题面

传送门
在这里插入图片描述

Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10;struct Edge{int next,to,w;
}e[N];int n,m,head[N],dist[N],cnt;bool st[N]; //判断某个点是否在队列中void add(int u,int v,int w){e[++cnt].to = v;e[cnt].next = head[u];e[cnt].w = w;head[u] = cnt;
}
int spfa(){memset(dist,0x3f,sizeof dist);queue<int> que;que.push(1);dist[1] = 0;st[1] = 1; //在队列中while(!que.empty()){auto u = que.front();que.pop();st[u] = false;//不在队列中了for(int i=head[u];i;i=e[i].next){int to = e[i].to;if(dist[to] > dist[u] + e[i].w){dist[to] = dist[u] + e[i].w;//避免重复入队if(!st[to]){que.push(to);st[to] = 1;}}}}return dist[n];
}
void solve(){cin >> n >> m;for(int i=1,u,v,w;i<=m;++i){cin >> u >> v >> w;add(u,v,w);}int ret = spfa();if(ret == 0x3f3f3f3f){cout << "impossible\n";}else cout << ret << '\n';
}int main(){std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);solve();return 0;
}

SPFA求负环

题面

传送门

在这里插入图片描述

思路

维护两个数组;

d i s t ( i ) dist(i) dist(i)表示起点到 i i i的最短距离;
c n t ( i ) cnt(i) cnt(i)表示最短距离经过的边数;

c n t ( i ) ≥ n , n cnt(i)≥n,n cnt(i)n,n为点的数量,那么说明至少经过了 n + 1 n+1 n+1个点,也就是说出现环了;

SPFA每次更新都只在dist变小的时候;

那么现在出现环了,且又变小了;

那么肯定就是负环;


注意

因为题目没有让我们维护最短路,因此我们只需要维护一个相对值即可;

而且题目只说存不存在负环,并没有指明具体哪个点开始;

因此我们在初始的时候将所有点纳入队列;


注意,SPFA判断负环的时间复杂度是很高的;

比如这题就跑了633ms;

在这里插入图片描述

Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10;struct Edge{int next,to,w;
}e[N];int n,m,head[N],dist[N],tot,cnt[N];bool st[N]; //判断某个点是否在队列中void add(int u,int v,int w){e[++tot].to = v;e[tot].next = head[u];e[tot].w = w;head[u] = tot;
}
int spfa(){queue<int> que;for(int i=1;i<=n;++i){que.push(i);st[i] = 1;}while(!que.empty()){auto u = que.front();que.pop();st[u] = false;//不在队列中了for(int i=head[u];i;i=e[i].next){int to = e[i].to;if(dist[to] > dist[u] + e[i].w){dist[to] = dist[u] + e[i].w;//只多了一条 u -> v的边cnt[to] = cnt[u] + 1;if(cnt[to] >= n) return true;//避免重复入队if(!st[to]) que.push(to);}}}return false;
}
void solve(){cin >> n >> m;for(int i=1,u,v,w;i<=m;++i){cin >> u >> v >> w;add(u,v,w);}bool ret = spfa();if(ret){cout << "Yes\n";}else cout << "No\n";
}int main(){std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);solve();return 0;
}

http://chatgpt.dhexx.cn/article/m10UgbFd.shtml

相关文章

OSPF中的SPF计算

OSPF域内路由计算&#xff1a;SPF计算 在1类LSA和2类LSA中&#xff0c;包括了拓扑信息和路由信息 Phase 1 &#xff1a;根据1类LSA中的P2P、TransNet、2类LSA&#xff0c;构建SPF树 Phase 2&#xff1a;根据1类LSA中的Stub、2类LSA&#xff0c;计算最优路由 左边是拓扑图&am…

聊一聊有限体积法

导读&#xff1a;有限体积法的工作原理。 一、求解对象 首先提一下我们的主角Navier-Stokes方程&#xff1a; 为了能够通过SIMPLE算法求解Navier-Stokes方程&#xff0c;我们需要将该方程改写为下列矩阵形式的方程&#xff1a; 其中为了系数矩阵&#xff0c;是每个网格未知…

IDEA中新导入的项目找不到maven project解决办法

刚导入的项目&#xff0c;导入进来之后&#xff0c;找不到maven project&#xff0c;idea打开view ->tool windows下也没有maven模块。查看了setting下plugins中maven插件也在。最后发现项目在导入过程中&#xff0c;因为选择的原因&#xff0c;没有指定位maven工程&#xf…

win10删除文件提示'找不到该项目'

win10系统下删除文件时出现了"找不到该项目"问题 遇到一个问题: win10系统下删除文件时出现了"找不到该项目"问题 百度搜索后得到 DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 这两行dos命令 创建(.txt)文件后写入这两行命令,保存,修改(.txt)至(.bat) 最后…

IDEA项目下不显示target目录或者target目录不完整没有新添加的资源

1.首先解决不显示target目录的问题 需要知道:如果不是maven工程,是没有target目录的,其次编译后才会生成target目录. 普通项目会生成out目录 a>如果设置过隐藏target目录 只需要找到settings-->Editor-->File Type-->Ignore Files and Folder删除该项 b>如果…

项目启动报错,找不到文件

java.io.FileNotFoundExceptionE:\software\apache-maven-3.6.1-bin\apache-maven-3.6.1\localrepository\xalan\xalan\2.7.0\xercesImpl.jar (系统找不到指定的文件。) java.io.FileNotFoundExceptionE:\software\apache-maven-3.6.1-bin\apache-maven-3.6.1\localrepository\…

idea项目类存在却找不到

这种情况&#xff0c;我真是奇了怪了&#xff0c;服了。我试了一下&#xff0c;试出了解决方案&#xff1a;将这个类移到同级另一个包&#xff0c;看见不报错了&#xff0c;再移回去。属于给idea虚晃一枪&#xff0c;再运行…emmmmm也还是报错的。于是不断的删iml文件&#xff…

Windows 删除”找不到该项目”文件夹

问题根源&#xff1a; 使用不可显示ASCII字符或采用UNICODE字符方法创建的文件或文件夹&#xff1b; 名称中含有..等特殊符号文件或文件夹名称不符合Windows命名规范或建立空格目录名创建的文件或文件夹&#xff1b; 使用下载工具创建的文件夹,在未下载完成前自行删除文件或…

idea找不到项目目录

有时候idea拉取项目时出现没有目录&#xff0c;src.main等等&#xff0c;下面就来带大家找到项目目录并显示出来 首先我们打开文件&#xff08;在左上角——找到项目结构&#xff09; 然后我们找到模块——点击左边那个加号,然后选择自己的项目目录。再选择一下jdk版本&#x…

【常见问题】vs 找不到导入的项目,请确认import声明

问题描述 当复制人家的vs项目文件到自己电脑上进行调试&#xff0c;重新生成解决方案失败&#xff0c;并报如下错误。 解决方法 1.分析报错内容&#xff0c;出现问题文件为vcxproj文件。 2.找到vcxproj文件&#xff0c;用记事本打开。 3.CTRLF搜索“Import”&#xff0c…

无法删除提示找不到该项目,该项目不在C:\users\?win10无法强力删除文件?

无法删除提示找不到该项目,该项目不在C:\users\?win10无法强力删除文件? 新建个TXT &#xff0c;把下边的代码粘贴过去&#xff1a; DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 保存之后把名字改成&#xff1a;Delete.bat 然后把要删除的文件夹拖到这个文件上&#xff0c;即可删…

git拉取项目报错:找不到项目 Repository not found

这段时间换了新公司&#xff0c;不想每天背着电脑跑来跑去了&#xff0c;就用了公司配发的电脑&#xff0c;前两天想用Git拉取公司的项目的时候却碰见问题了&#xff0c;无论是Git命令行拉取还是使用idea拉取&#xff0c;都会报错找不到项目 但是在浏览器使用链接是可以访问到项…

问题:找不到该项目,该项目不在指定目录下.......请确认位置......

参考网址&#xff1a;http://bbs.kafan.cn/thread-1398433-1-1.html 1.把下面的代码复制粘贴到一新建的txt记事本文档中&#xff0c;并另存为del.bat文件&#xff08;或者你喜欢的名字&#xff09;&#xff0c;注意扩展名为批处理文件bat&#xff1b; DEL /F /A /Q \\?\%1 RD …

windows删文件:找不到该项目,该项目不在xx中,请确认位置,然后重试 的解决方案

起因是手贱 打错了 搞得生成了一个 以.结尾的文件&#xff0c;删又删除不了&#xff0c;莫名其妙&#xff0c;然后 git push 也出问题&#xff1b; 删除就弹出类似下面的提示&#xff1b;删除上层文件夹也没用&#xff1b; 网上搜了一堆解决办法&#xff0c;说什么建立一个 ba…

找不到项目 该项不在计算机中,删除文件夹提示找不到该项目怎么删除?“找不到该项目”强删方法(图文)...

在使用电脑的过程中,尤其是办公,去创建一些文档,但是在删除的时候就删除不了了,系统提示“找不到该项目”,那么Win7删除文件夹找不到该项目怎么删除?下面云狐网分享一下删除文件或者文件夹提示“找不到该项目”强删方法,不会的来学习一下。uK5电脑_数码_手机应用问题解决…

出现“找不到该项目”的错误提示解决方法

在使用Windows7系统删除文件或者文件夹的时候&#xff0c;会出现“找不到该项目”的错误提示&#xff0c;可能再次“重试”也无济于事&#xff0c;今天就为大家简单概括一下出现该问题的原因及解决方法。 针对出现该问题的不同原因对应的解决办法&#xff1a; 第一&#xff1a…

Windows下删除文件夹提示找不到该项目,请确认该项目的位置,然后重试。

解决方法&#xff1a; 1&#xff0c;在桌面新建一个文件&#xff0c;里面输入以下内容&#xff1a; DEL /F /A /Q \\?\%1 RD /S /Q \\?\%12&#xff0c;保存文件&#xff0c;然后将后缀名txt改为bat 3&#xff0c;将不可删除的文件夹拖拽到这个文件上面&#xff0c;会发现…

电脑删除文件找不到该项目怎么解决

文件明明就在桌面&#xff0c;想删除但就是删不掉&#xff0c;强迫症表示真的很难受 这时你可以这样 1.桌面新建一个TXT文本文档&#xff0c;重命名为“删除”&#xff08;你想命名为其他的也可以&#xff09; 2.打开该文件&#xff0c;输入 DEL /F /A /Q \\?\%1 RD /S /…

win10系统下删除文件夹失败,提示“找不到该项目”

问题场景&#xff1a;win10系统下删除文件夹失败&#xff0c;提示“找不到该项目”。 删除一个解压失败的目录时&#xff0c;一直提示上述问题。磁盘自检无异常&#xff0c;文件系统正常 删除时要么提示“找不到该项目”&#xff0c;要么提示需要xx用户权限。 后者更改此文件…

【奇奇怪怪的bug】删除文件显示「找不到该项目」怎么办

从网盘下载的文件&#xff0c;复制、改文件名或删除时总是提示找不到该项目&#xff0c;刷新重启都没用&#xff01;&#xff01; 尝试了各种方法后&#xff0c;终于解决了&#xff01; ①下载7-zip ②使用管理员权限打开 7-zip ③找到文件所在的位置 ④选择压缩该文件并删…