关于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. Js/使用js来改变css的样式

    1.一般来说我最先想到的是,通过id的方式去改变css的样式,所以有了下面这种写法: 2.第二种我想到的办法是通过改变他的class的名称,去设置 他的样式,其中用的比较多的就是这样的:

  2. Address localhost:1099 is already in use

    在 ItelliJ idea中创建了Servlet,启动tomcat时系统报错: Error running Tomcat 7.0.47: Address localhost:1099 is alre ...

  3. 【paper】MTCNN

    参考 1. MTCNN笔记; 完

  4. tcpkill,干掉tcp连接

    场景 当我们需要在不重启服务的情况下断开某一个TCP长连接时,tcpkill工具就非常有用.比如我们要测试某个长连接断开后程序自动重连的情况. tcpkill安装 这个连接的作者改了一下tcpkill ...

  5. java.lang.ClassNotFoundException的解决方法

    java.lang.ClassNotFoundException的解决方法   出现这个问题的原因可能很多,但是最终原因都是部署的项目文件中没有这个类包. 那么出错的点在哪呢?逐一排除! 1.首先在项 ...

  6. 常用解压包命令----tar--rar

    systemctl stop firewalld    --关闭 linux服务器防火墙 1.*.tar 用 tar –xvf 解压  2.*.gz 用 gzip -d或者gunzip 解压 3.*. ...

  7. Python全栈之路----Python基础元素

    1.变量定义规则                 声明变量   name = " Alex Li"     其中,name是变量名(标识符),"Alex Li" ...

  8. day02python入门

    今日概要 解释器环境安装 输出 python试执行 数据类型 变量 输入 注释 条件判断 循环 占位符 数据类型转换 1. 环境的安装 python解释器 py2: Python2.7 (老版本) . ...

  9. js··事件捕捉

    给一个元素绑定事件,普通写法是 obj.onclick=function(){} 这就相当于给obj的onclick属性赋值是一个道理. obj.onclick=function(){} 这种写法有一 ...

  10. 国内优秀MVC开源框架jfinal简介

    JFinal简介 JFinal 项目开发始于2011年初,作者詹波(James Zhan)曾任搜格信息技术有限公司Java架构师,北京信息管理科学研究所CTO,现任微格网际(北京)科技有限公司联合创始 ...