首页 > 其他分享 >spfa优化

spfa优化

时间:2024-03-08 20:14:46浏览次数:30  
标签:head dist cur int st spfa front 优化

\(spfa\) 的优化都是基于 \(deque\) 的,我们通常使用 \(LLL\) 优化,代码简单,优化效果最好,详情可见参考这里,例题可以参考这里

1. \(LLL\) 优化(入队优化)

Large Label Last 优化:思路就是将 \(dist\) 更大的点放入队尾,将 \(dist\) 更小的点放入队头,优先使用 \(dist\) 更小的点进行松弛操作。

void spfa(int head)
{
    memset(dist, 0x3f, sizeof dist);
    memset(st, false, sizeof st);
    dist[head] = 0;
    
    deque<int> q;
    q.push_front(head);
    st[head] = true;
    
    while(q.size())
    {
        int cur = q.front();
        q.pop_front();
        st[cur] = false;
        for(int i = h[cur]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dist[j] > dist[cur] + w[i])
            {
                dist[j] = dist[cur] + w[i];
                if(!st[j])
                {
                /*============== LLL 优化 ==============*/
                    if(q.empty() || dist[j] > dist[q.front()])
                        q.push_back(j);
                    else    q.push_front(j);
                /*======================================*/
                    st[j] = true;
                }
            }
        }
    }
}

2. \(SLF\) 优化(出队优化)

Small Label First 优化:优先让 \(dist\) 更小的节点出队来进行松弛操作,不过这个“小”并不好把握,总不能遍历一遍队列找这个小的 \(dist\) 把。因此,这里的“小”是平均意义上的小,即小于等于队列中所有元素的平均值,因此我们要维护队列元素个数 \(cnt\) (不用q.size(),调用函数可能更慢)和队列中的元素和 \(sum\),通过 while 来进行判断,不过由于优化逻辑中有个 while,其优化效果可能很玄?

void spfa(int head)
{
    memset(dist, 0x3f, sizeof dist);
    memset(st, false, sizeof st);
    dist[head] = 0;
    
    deque<int> q;
    q.push_front(head);
    st[head] = true;
    
    /*================================*/
    int sum = dist[head], cnt = 1;
    /*================================*/
    
    while(q.size())
    {
        int cur = q.front();
        /*============================*/
        while(dist[cur] * cnt > sum) 
        {
            q.push_front();
            q.push_back(cur);
            cur = q.front();
        }
        /*============================*/
        q.pop_front();
        st[cur] = false;
        /*============================*/
        cnt -- , sum -= dist[cur];
        /*============================*/
        for(int i = h[cur]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dist[j] > dist[cur] + w[i])
            {
                dist[j] = dist[cur] + w[i];
                if(!st[j])
                {
                    q.push_back(j);
                    /*============================*/
                    cnt ++ , sum += dist[j]; 
                    /*============================*/
                    st[j] = true;
                }
            }
        }
    }
}

标签:head,dist,cur,int,st,spfa,front,优化
From: https://www.cnblogs.com/ALaterStart/p/18061754

相关文章

  • 使用Web Vitals针对性的优化前端LCP指标
    1、安装WebVitals浏览器插件2、打开设置3、勾选打印日志 4、打开浏览器控制台即可查看需要优化的点5、LCP耗时的构成部分"LCPsub-part":"TimetoFirstByte""Time(ms)":39这个部分时间表示服务器的首个字节到达所花费的时间。这是指从浏览器发出请求到服务......
  • MySQL查询优化方案汇总(索引相关)
    索引相关类型隐式转换大坑**字段filed1是varchar类型,且加了索引,如果wherefiled1=123;type可能是all,因为123是数字类型,mysql内部会用函数做隐式转换,用了函数,索引就失效了。**大数据深度分页,用主键selectfield1,field2fromtablelimit100000,10;selectfield1,fiel......
  • Unity3D 多人战场Animation优化详解
    在多人战场游戏中,动画的优化是非常重要的,因为动画是游戏中的核心元素之一,直接影响玩家的游戏体验。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在本文中,我们将详细介绍如何在Unity3D中优化多人战......
  • 聊聊懒加载以及优化方案
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:霁明什么是懒加载(lazyloading)懒加载是一种将资源标识为非阻塞(非关键)资源并仅在需要时加载它们的策略。这是一种缩短关键渲染路径长度......
  • 常见性能优化方案与实用工具
    微信工程师:常见性能优化方案与实用工具https://mp.weixin.qq.com/s/glrqsyBSIVCDp7oZw2rO_w......
  • Unity3D 多人战场Animation优化详解
    在多人战场游戏中,动画的优化是非常重要的,因为动画是游戏中的核心元素之一,直接影响玩家的游戏体验。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在本文中,我们将详细介绍如何在Unity3D中优化多人战......
  • clang在指定-O2时对函数局部变量的优化
    在我们将编译器从g++迁移到clang++的过程中,遇到一个问题,有个工具程序只要一运行就会出现coredump问题,并且用gdb调试core文件也无法获得任何有用的堆栈信息。通过不断尝试,发现只有在clang++使用-O2编译时得到的程序才会发生这个问题,使用clang++-O0或者g++编译时不会发生问题。......
  • bitset 相关优化
    bitset基础用法operator[]:访问其特定的一位。operator==/!=:比较两个bitset内容是否完全一样。operator&/&=/|/|=/^/^=/~:进行按位与/或/异或/取反操作。bitset只能与bitset进行位运算,若要和整型进行位运算,要先将整型转换为bitset。operator<>/<<=/>>=:进行......
  • springboot3+vue3(四.2)ThreadLocal优化
    解决痛点:我们在拦截器内已经获取并解析了一遍token数据,如图:然后在获取当前登录用户详细信息时又做了一遍同样的操作,如图:后续如果说需要用到当前登录用户的信息时都要带上token参数,这样是很冗余的。这时就会用到ThreadLocal来进行优化处理。 ThreadLocal工具类/***......
  • SQL优化实战分析
    分享一个案例,一条SQL引发的“血案”!技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。以一个例子为切入点一、问题背景这是一个数据仓库系统,正常情况下每天0~6点会跑批,生成前一天的业务报表,供管理层分析使用。某天凌晨,监控系统频繁发出告警,大批业务报......