关于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的更多相关文章

  1. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  2. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  3. sgu 240 Runaway (spfa)

    题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口.逃出去,使最大承受温度最小.输出该温度,若该温度超过H,输出-1. 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最 ...

  4. spfa模板

    通过stl的queue实现的spfa(vector实现邻接表存图) 本模板没有考虑存在两点不连通的情况 如果需要判断则需要用到并查集或者遍历整个邻接表 #include<iostream> ...

  5. SPFA

    SPFA算法用来求单源最短路.可以处理任何有解的情况. 先建一个数组\(dist_x = 起点到x的最短路长度\),当\(x=起点\)时为0,当x和起点不通时为INF(本题中为\(2^31-1\)). ...

  6. BZOJ2763 [JLOI2011]飞行路线(SPFA + DP)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=2763 Description Alice和Bob现在要乘飞机旅行,他们选择了一家 ...

  7. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  8. bzoj 1179[Apio2009]Atm (tarjan+spfa)

    题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  9. codevs 1021 玛丽卡(spfa)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  10. UVA11090 Going in Cycle!! [spfa负环]

    https://vjudge.net/problem/UVA-11090 平均权值最小的回路 为后面的做个铺垫 二分最小值,每条边权减去他,有负环说明有的回路平均权值小于他 spfa求负环的时候可以先 ...

随机推荐

  1. Centos yum 命令行 安装KDE Desktop

    1:修改yum源为本地源 (见相关随笔:centos 配置本地yum源) 2:# yum groupinstall "X Window System" ← 安装基本的X系统组件# ...

  2. build to win读后感

    在软件开发的过程中,不能盲目去show自己的成果,而是要大量考虑别人的意见,在广范围的撒网之后,收集意见,最后在一锤定音. 还有就是,要懂得团队合作,例如,本文介绍了一个事例,作者的团队与科研团队合作 ...

  3. java中的可释放资源定义,类似c#中的using

    public static class FileDuplicator implements AutoCloseable { Scanner in = null; PrintWriter out = n ...

  4. 访问google提示"您的连接不是私密连接"

    直接访问google 提示这个,连subject 也变成连baidu 您的连接不是私密连接 攻击者可能会试图从 www.google.com 窃取您的信息(例如:密码.通讯内容或信用卡信息).了解详情 ...

  5. 策略模式(Strategy )

    为实现一个目的采用不同的方式都可实现,具体看要采取哪种方式. //接口 public interface Strategy {    public void algorithmInterface(); ...

  6. nginx的白名单

    为nginx设置白名单的几个步骤:   第一步:指定能访问的白名单   vim /etc/nginx/ip.conf (如果在公司,记得这里是外网IP,要不然测很久都不知道为什么不行) ;   第二步 ...

  7. docker镜像制作 centos6 nginx1.15.6 with NGINX_UPSYNC_MODULE

    首先我选择了在centos6里部署nginx的镜像,如果大家选择的是centos7,自己重新修改吧 这里的问题点有几个: 1,make的版本选择,因为我下载了最新的cmake,需要c++11编译 这玩 ...

  8. google的protobuf简单介绍

    google的protobuf是一种轻便高效的结构化数据存储格式,在通信协议和数据存储等领域中使用比较多.protobuf对于结构中的每个成员,会提供set系列函数和get系列函数. 但是,对于使用来 ...

  9. Python模块subprocess

    subprocess的常用用法 """ Description: Author:Nod Date: Record: #-------------------------- ...

  10. WPF Binding Mode,UpdateSourceTrigger

    WPF 绑定模式(mode) 枚举值有5个1:OneWay(源变就更新目标属性)2:TwoWay(源变就更新目标并且目标变就更新源)3:OneTime(只根据源来设置目标,以后都不会变)4:OneWa ...