关于spfa
关于spfa的一些事宜....
刚开始学的时候只会跑最短路,代码都是背下来的。以下是背的代码...
inline void spfa(int s)
{
queue<int>q;q.push(s);
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
vis[s]=;dis[s]=;
while(!q.empty())
{
int x=q.front();q.pop();vis[x]=;
for(int i=link[x];i;i=a[i].next)
{
int y=a[i].y;
if(dis[y]>dis[x]+a[i].v)
{
dis[y]=dis[x]+a[i].v;
if(vis[y]!=){vis[y]=;q.push(y);}
}
}
}
}
虽然有很多不懂得,但拿着标版还是可以做题的。
很显然,spfa用的是链式前向星(或边表)存的图。
但光背代码是不行的,终于有一道题卡住我了...


相信大佬们一看就会了,但这道题确实卡了我许多天。
我认真的看看了题解,终于懂得spfa原来还可以这样用!
这里可以讲一下spfa的原理了,spfa其实用队列优化的工具。它其实就是BFS了,可以用来图的遍历只不过是一层一层扫的。经常用到的的就是图的单源最短路,其实就是给定一个点s,求这个点都其余所有点的最短路。证明:从队尾取出来一个"松弛"过得点,然后枚举这个点能连到的所有边,看s点到边连接的另一个点能否用这个点“松弛”,如果能的话,进行松弛,且将这个刚被松弛的点放入队尾,用它来松弛其他的点,这样每次s点到各点的距离就会减少,直至减少至最短距离。或许有人会问:那如果一直循环下去呢,怎么办?不要怕,这就是spfa另一个强大得功能,判负环。一直循坏,说明最短距离一直被更新,说明就有负环出现了。
具体的原理可以看以下的图片(讲的挺详细的,我就是看这个才有启发的):

.这只是spfa最基本的功能,根据此原理,这道题就好写了。我们可以分别用minn数组来存从起点到第i点保存的最小值,即从起点出发,无论咋走,最后走到第i点保存的最小值。这样就保证了贸易是能买到的最小值。用maxx数组来存从终点到第i点保存的最大值,即即从终点出发,无论咋走,最后走到第i点保存的最大值。保证了第i点走到终点的最大值。最后for循环枚举各个点即可。(具体细节自己考虑)
中心代码:
inline void spfa1()
{
queue<int>q;q.push();
memset(minn,,sizeof(minn));
minn[]=awp[];vis[]=;
while(q.size())
{
int x=q.front();q.pop();
for(int i=link1[x];i;i=a1[i].next)
{
int y=a1[i].y;
if(minn[y]>minn[x])
{
minn[y]=min(minn[x],awp[y]);
if(vis[y]!=) {q.push(y);vis[y]=;}
}
}
vis[x]=;
}
}
inline void spfa2()
{
queue<int>q;q.push(n);
memset(vis,,sizeof(vis));
vis[n]=;maxx[n]=awp[n];
while(q.size())
{
int x=q.front();q.pop();
for(int i=link2[x];i;i=a2[i].next)
{
int y=a2[i].y;
if(maxx[y]<maxx[x])
{
maxx[y]=max(awp[y],maxx[x]);
if(vis[y]==){vis[y]=;q.push(y);}
}
}
vis[x]=;
}
}
来个小总结吧!spfa其实有很多功能,但只用于链表。其中依据单源最短路的原理可以跑出从某一点出发到达任何点保存的最大值和最小值(点权和边权均适用)。当然,依据其bfs搜索的原理,也可以遍历图。
不知道你学会了吗?
最后,谢谢观看鄙人的处女作!
关于spfa的更多相关文章
- 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
3627: [JLOI2014]路径规划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 186 Solved: 70[Submit][Status] ...
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
传送门 Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 46727 Acce ...
- sgu 240 Runaway (spfa)
题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...
- spfa模板
通过stl的queue实现的spfa(vector实现邻接表存图) 本模板没有考虑存在两点不连通的情况 如果需要判断则需要用到并查集或者遍历整个邻接表 #include<iostream> ...
- SPFA
SPFA算法用来求单源最短路.可以处理任何有解的情况. 先建一个数组\(dist_x = 起点到x的最短路长度\),当\(x=起点\)时为0,当x和起点不通时为INF(本题中为\(2^31-1\)). ...
- BZOJ2763 [JLOI2011]飞行路线(SPFA + DP)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=2763 Description Alice和Bob现在要乘飞机旅行,他们选择了一家 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- codevs 1021 玛丽卡(spfa)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- UVA11090 Going in Cycle!! [spfa负环]
https://vjudge.net/problem/UVA-11090 平均权值最小的回路 为后面的做个铺垫 二分最小值,每条边权减去他,有负环说明有的回路平均权值小于他 spfa求负环的时候可以先 ...
随机推荐
- File类相关操作
1.File类常见方法: 创建: boolean createNewFile():在指定位置创建文件 如果该文件已经存在,则不创建,返回false,和输出流不一样,输出流对象一建立就创立文件,而且文件 ...
- JAVA高级篇(四、JVM垃圾回收和调优)
本文转自https://zhuanlan.zhihu.com/p/25539690 JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会 ...
- autotools
文章目录 原文地址 Autotools上手指南1--autoconf基本思想 Autotools上手指南2--autoscan生成configure.ac Autotools上手指南3--autohe ...
- ssh登录原理及免密登录方法
免密登录设置 1.进入到我的home目录 cd ~/.ssh 2.生成ssh免登陆秘钥ssh-keygen -t rsa (四个回车) 执行完这个命令后,会生成两个文件id_rsa(私钥) ...
- 【转载】Ocelot网关的路由热更新
调用API修改Ocelot的配置文件 May 11, 2018 | netcoreocelot | 410 阅读 Ocelot是一个基于.net core的开源webapi服务网关开源项目,功能比较强 ...
- js 函数问题
replace() is not a function 1,情景描述:做项目的时候想把内容的某些字符给替换成另外一些字符 2,replace用法:replace() 方法用于在字符串中用一些字符替换另 ...
- python print format
python print format %o —— oct 八进制 %d —— dec 十进制 %x —— hex 十六进制 1 >>> print('%o' % 20) 2 24 ...
- Spring Boot - 项目构建与解析
构建 Maven 项目 通过官方的 Spring Initializr 工具来产生基础项目,访问 http://start.spring.io/ ,如下图所示,该页面提供了以Maven构建Spring ...
- Node.js express获取参数有三种方法
express获取参数有三种方法:官网介绍如下 Checks route params (req.params), ex: /user/:id Checks query string params ( ...
- Python字符串列表元祖字典的公共方法
运算符 运算符 Python 表达式 结果 描述 支持的数据类型 + [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串.列表.元组 * 'Hi!' * 4 ['Hi!', 'Hi ...