首页 > 其他分享 >spfa优化

spfa优化

时间:2024-03-05 14:56:32浏览次数:27  
标签:map sum value vis spfa push 优化 dis

1. SLF优化

  在我们学SPFA的时候,要把每一个入队的点插入到队尾,可是有些时候这个点作为队尾没有作为队头效率高,因为这个点有时放在队首就能直接用,那么什么样的点作为队首更好呢?当然是dis值越小越可能刷新其它\(dis\)值,所以对比当前元素与对首元素的\(dis\)值,如果当前元素的\(dis\)值更小,那么把当前元素插入到队首,否则插入到队尾。此时\(queue\)应该改为\(deque\)双端队列。

code
void SPFA()
{
    memset(dis,inf,sizeof(dis));
    deque<int>q;
    q.push_back(1);dis[1]=0;vis[1]=1;
    while(q.size())
    {
        x=q.front();q.pop_front();vis[x]=0;
        for(int i=head[x];i;i=map[i].next)
        {
            s=map[i].to;
            if(dis[s]>dis[x]+map[i].value)
            {
                dis[s]=dis[x]+map[i].value;
                if(vis[s]==0)
                {
                    if(dis[s]<dis[q.front()]) q.push_front(s);
                    else q.push_back(s);//新加
                    vis[s]=1;
                }
            }
        }
    }
}

2. LLL优化

如果懂了上一个SLF优化,那么这个LLL优化就很好理解了,SLF表示小的优先,LLL表示大的最后,那么什么样的的dis值是大的呢?难道还和队首元素比较吗?当然不是,是于队列的平均数来比较,如果大于这个平均数就放到最后。

code
void SPFA()
{
    memset(dis,inf,sizeof(dis));
    queue<int>q;
    q.push(1);dis[1]=0;vis[1]=1;
    while(q.size())
    {
        p=q.front();q.pop();
        if(dis[p]*cnt_2>sum)
        {
            q.push(p);
            continue;
        }
        sum-=dis[p];cnt_2--;//新加
        vis[p]=0;
        for(int i=head[p];i;i=map[i].next)
        {
            s=map[i].to;
            if(dis[s]>dis[p]+map[i].value)
            {
                dis[s]=dis[p]+map[i].value;
                if(vis[s]==0)
                {
                    vis[s]==1;
                    q.push(s);
                    cnt_2++;
                    sum+=dis[s];//新加
                }
            }
        }
    }
}

2. SLF+LLL优化

code
void SPFA()
{
    memset(dis,inf,sizeof(dis));
    deque<int>q;
    q.push_back(1);dis[1]=0;vis[1]=1;
    while(q.size())
    {
        p=q.front();q.pop_front();
        if(dis[p]*cnt_2>sum)
        {
            q.push_back(p);
            continue;
        }
        sum-=dis[p];cnt_2--;
        vis[p]=0;;
        for(int i=head[p];i;i=map[i].next)
        {
            s=map[i].to;
            if(dis[s]>dis[p]+map[i].value)
            {
                dis[s]=dis[p]+map[i].value;
                if(vis[s]==0)
                {
                    vis[s]==1;
                    if(dis[s]<dis[q.front()]) q.push_front(s);
                    else q.push_back(s);
                    cnt_2++;
                    sum+=dis[s];
                }
            }
        }
    }
}

标签:map,sum,value,vis,spfa,push,优化,dis
From: https://www.cnblogs.com/ppllxx/p/18054028

相关文章

  • 使用 explain 索引优化(转)
    使用explain索引优化(转)原文:https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ==&mid=2247490262&idx=1&sn=a67f610afa984ecca130a54a3be453ab&source=41#wechat_redirect1、前言对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢......
  • 聊聊sql优化的15个小技巧(转)
    原文:https://mp.weixin.qq.com/s/DsUrEHdkMvsO7RvnDcKNhg1避免使用select*很多时候,我们写sql语句时,为了方便,喜欢直接使用select*,一次性查出表中所有列的数据。反例:select*fromuserwhereid=1;在实际业务场景中,可能我们真正需要使用的只有其中一两列。查了很多数据,但......
  • mysql8.0 性能优化配置 innodb_buffer_pool_size(配置原则和方式)
    1. BufferPool缓冲池是主内存中的一个区域,InnoDB在访问表和索引数据时会在该区域进行缓存。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,通常会将高达80%的物理内存分配给缓冲池。2.简单优化把innodb_buffer_pool_size设置为1G。专用服务......
  • 44对象优化
    对象优化对象优化的原则:函数参数传递的过程中,对象优先按引用传递,不要按值传递,这样少形参的构造和析构函数返回对象时,优先返回一个临时对象,而不要返回一个定义过的对象,这样少一个函数中对象的构造析构接受返回值是对象的函数调用时,用初始化的方式接受,而不用先定义再赋值的方式......
  • 快速排序的三种实现及简单优化(内附代码实现)
    概念​ 先贴一段百度:快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素key,利用key将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。步......
  • vue项目的优化方法有哪些?
    Vue项目的优化是一个综合考虑多方面因素的过程,包括代码、性能、资源、打包等方面。下面是一些常见的Vue项目优化方法:代码层面优化:组件拆分:将大型组件拆分成小型组件,提高组件的复用性和可维护性。避免不必要的计算:尽量减少不必要的计算,避免重复计算。使用异步组件:对于......
  • SEO网站优化排名机制
    新站期:刚上线不久的新站(1——3个月),搜索引擎还没有计算并赋予页面得分收录少,收录周期短,页面得分低,网站综合权重不高,排名能力较弱无页面得分阶段:搜索引擎收录了你的页面,还没有计算,或通过计算之后并没有赋予页面得分页面得分阶段(随机性排名阶段):网站排名80%的权力是搜索引擎机器识......
  • 【个人前端笔记】web性能优化:连接复用
    一、连接复用keep-alive当我们去连接www.baidu.com的时候,会经历以下过程(没有连接复用)连接过程:发起TCP连接---->请求资源----->下载资源---->关闭TCP连接---->再次发起TCP连接.....如果有多个资源需要请求,我们就要发起tcp然后关闭tcp连接,然后再发起和关闭如果可以发起一次tcp......
  • 这波操作看麻了!十亿行数据,从71s到1.7s的优化之路。
    你好呀,我是歪歪。春节期间关注到了一个关于Java方面的比赛,很有意思。由于是开源的,我把项目拉下来试图学(白)习(嫖)别人的做题思路,在这期间一度让我产生了一个自我怀疑:他们写的Java和我会的Java是同一个Java吗?不能让我一个人怀疑,所以这篇文章我打算带你盘一下这个比赛,并且......
  • AIGC下一步:如何用AI再度重构或优化媒体处理?
    让媒资中“沉默的大多数”再次焕发光彩。邹娟|演讲者编者按AIGC时代下,媒体内容生产领域随着AI的出现也涌现出更多的变化与挑战。面对AI的巨大冲击,如何优化或重构媒体内容生产技术架构?在多样的应用场景中媒体内容生产技术又有着怎样的实践效果?LiveVideoStackCon2023深圳站邀请......