关于spaf

gcfer 2018-12-25 原文

关于spaf

关于spfa的一些事宜….

刚开始学的时候只会跑最短路,代码都是背下来的。以下是背的代码…

inline void spaf(int s)
{
queue<int>q;q.push(s);
memset(dis,10,sizeof(dis));
memset(vis,0,sizeof(vis));
vis[s]=1;dis[s]=0;
while(q.size())
{
int x=q.front();q.pop();
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]!=1){vis[y]=1;q.push(y);}
}
}
vis[x]=0;
}
}

  

虽然有很多不懂得,但拿着标版还是可以做题的。

很显然,spaf用的是链式前向星(或边表)存的图。

但光背代码是不行的,终于有一道题卡住我了…

相信大佬们一看就会了,但这道题确实卡了我许多天。

我认真的看看了题解,终于懂得spaf原来还可以这样用!

这里可以讲一下spaf的原理了,spaf其实用队列优化的工具。它其实就是BFS了,可以用来图的遍历只不过是一层一层扫的。经常用到的的就是图的单源最短路,其实就是给定一个点s,求这个点都其余所有点的最短路。证明:从队尾取出来一个”松弛”过得点,然后枚举这个点能连到的所有边,看s点到边连接的另一个点能否用这个点“松弛”,如果能的话,进行松弛,且将这个刚被松弛的点放入队尾,用它来松弛其他的点,这样每次s点到各点的距离就会减少,直至减少至最短距离。或许有人会问:那如果一直循环下去呢,怎么办?不要怕,这就是spaf另一个强大得功能,判负环。一直循坏,说明最短距离一直被更新,说明就有负环出现了。

具体的原理可以看以下的图片(讲的挺详细的,我就是看这个才有启发的):

.这只是spaf最基本的功能,根据此原理,这道题就好写了。我们可以分别用minn数组来存从起点到第i点保存的最小值,即从起点出发,无论咋走,最后走到第i点保存的最小值。这样就保证了贸易是能买到的最小值。用maxx数组来存从终点到第i点保存的最大值,即即从终点出发,无论咋走,最后走到第i点保存的最大值。保证了第i点走到终点的最大值。最后for循环枚举各个点即可。(具体细节自己考虑)

中心代码:

inline void spaf1()
{
    queue<int>q;q.push(1);
    memset(minn,10,sizeof(minn));
    minn[1]=awp[1];vis[1]=1;
    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]!=1) {q.push(y);vis[y]=1;}
            }
        }
        vis[x]=0;
    }                                                                   
}
inline void spaf2()
{
    queue<int>q;q.push(n);
    memset(vis,0,sizeof(vis));
    vis[n]=1;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]==0){vis[y]=1;q.push(y);}
            }
        }
        vis[x]=0;
    }
}

来个小总结吧!spaf其实有很多功能,但只用于链表。其中依据单源最短路的原理可以跑出从某一点出发到达任何点保存的最大值和最小值(点权和边权均适用)。当然,依据其bfs搜索的原理,也可以遍历图。

不知道你学会了吗?

最后,谢谢观看鄙人的处女作!

发表于 2018-12-25 17:26 逆天峰王者 阅读() 评论() 编辑 收藏

 

版权声明:本文为gcfer原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gcfer/p/10175295.html

关于spaf的更多相关文章

随机推荐

  1. Extensions in UWP Community Toolkit – ListViewExtensions

    概述 UWP Community Toolkit Extensions 中有一个为 ListView 提供的扩 […]...

  2. 微信公众号教程(2)微信公众平台后台介绍

         微信公众平台后台介绍  原文:http://www.cnblogs.com/imaker/p/624 […]...

  3. JaveScript简单数据类型(JS知识点归纳二)

    JS中的简单数据类型有五种 :      –> string     –> […]...

  4. 雾计算简史

    欢迎关注我的个人公众号 aCloudDeveloper,打造云计算干货分享平台,你值得拥有。 在我看来,雾计算 […]...

  5. 【转】离散傅里叶变换-DFT(FFT)基础

    转:https://blog.csdn.net/zhangxz259/article/details/8162 […]...

  6. Mac之间的 远程控制

      Mac 自带屏幕共享的工具,两台 Mac 之间的设置步骤:   1.主机(被远程控制的电脑)的设置:    […]...

  7. 20个常用java代码段

      下面是20个非常有用的Java程序片段,希望能对你有用。 1. 字符串有整型的相互转换 String a […]...

  8. hibernate关联数据作为查询条件

    hibernate关联数据作为查询条件 hibernate中,在前台当表关联的数据作为查询条件时,因为hibe […]...

展开目录

目录导航