关于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求负环的时候可以先 ...
随机推荐
- CMake 构建项目教程-简介
CMake 构建项目教程-简介 Linux 平台构建项目,选择了CLion作为C++的IDE,而CLion默认就是使用CMake构建项目,所以这里记录了CMake在构建项目过程的一些小知识. 1. 项 ...
- hdu 5776 抽屉定理
sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submiss ...
- python:基本统计值计算(平均数,方差,中位数)
#CalStatisticsV1.py def getNum(): #获取用户不定长度的输入 nums=[] test=input("请输入要存储的数据(回车退出):") whil ...
- PythonStudy——运算符优先级 Operator precedence
运算符优先级 以下所列优先级顺序按照从低到高优先级的顺序:同行为相同优先级. 1 Lambda #运算优先级最低 2 逻辑运算符: or 3 逻辑运算符: and 4 逻辑运算符:not 5 成员测试 ...
- nginx添加一个站点
server { listen ; server_name demo.abc.com ; root /Users/pa200318/demo.cp.com/trunk; index index.php ...
- Centos7更改yum源
每次都要百度一番,还不如自己做个记录,简单粗暴,哈哈哈哈 cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.repo.old wget http: ...
- oidc User.Identity.Name 为空解决方法
public override Task TicketReceived(TicketReceivedContext context) { var result = base.TicketReceive ...
- Mysql建了索引查询很慢
遇到一个问题,有几个结构一个的查询,表的索引建的也一样,但是有的查询很快,有的却很慢,需要半分钟以上才能执行完. 查看执行计划,并没有什么区别.找了很久原因才发现是主查询和子查询所涉及的表的字符编码不 ...
- 学习笔记之Machine Learning Crash Course | Google Developers
Machine Learning Crash Course | Google Developers https://developers.google.com/machine-learning/c ...
- [UE4]ProgressBar,进度条
准备好2张进度条图片 一.新建名为“testProgress”的UserWidget,添加一个名为“ProgressBar_0”的ProgressBar到默认容器Canvas Panel 二.进度条进 ...