spfa优化 SLF LLL

2013.10.23 更新

之前写的时候不知道在想什么,整理模板时才发现写挫了,现在重发一个

SPFA 是按照 FIFO 的原则更新距离的, 没有考虑到距离标号的作用. 实现中 SPFA 有两个非常著名的优化: SLF 和 LLL.

  SLF: Small Label First 策略.
  实现方法是, 设队首元素为 ,
队列中要加入节点 ,

时加到队首而不是队尾, 否则和普通的 SPFA 一样加到队尾. 这可以用个优先级队列维护

  LLL: Large Label Last 策略. 
  实现方法是, 设队列
中的队首元素为 ,
距离标号的平均值为 ,
每次出队时, 若 ,

移到队列末尾, 如此反复, 直到找到一个
使 ,
将其出队.

 

/**
    复杂度分析:
        普通SPFA km kmax=n 不适合稠密图 一般为2
        优先级队列  加入节点复杂度logn 节点数太多时适得其反,对于特殊数据速度略小于普通spfa
                     对于随机图效果很好
        手动模拟SLF,LLL 复杂度低于优先级队列,最坏情况与普通SPFA持平

*/

#define Maxn 100010//最大点数
#define Maxm 400010//最大边数,无向图要建双向边
int w[Maxm],u[Maxm],next[Maxm],cnt;
int first[Maxn],havein[Maxn];//havin为入队次数
long long d[Maxn];//距离
int n;
bool in[Maxn];//队中标志
inline void add(int vn,int un,int wn){//邻接表存储
    u[cnt]=un;w[cnt]=wn;next[cnt]=first[vn];first[vn]=cnt++;
}
struct node{
    int v,dd;
    node(int &a):v(a),dd(d[a]){};
    bool operator< (const node& a)const{
        return dd>a.dd;
    }
};
priority_queue<node> q; //利用优先级队列SLF和LLL
bool spfa(int s){
    int i,now,ne,t;
    memset(in,0,sizeof(in));
    memset(havein,0,sizeof(havein));
    for(i=0;i<n;i++)d[i]=INF; //memset(d,0x3f,sizeof(d));
    d[s]=0;in[s]=1;q.push(s);
    while(!q.empty()){
        now=q.top().v;q.pop();
        if(!in[now])continue;
        in[now]=0;
        for(i=first[now];~i;i=next[i]){
            ne=u[i];
            if(d[ne]<=(t=d[now]+w[i]))continue;
            d[ne]=t; in[ne]=1; q.push(ne);
            if(++havein[ne]>n)return 0;//判断有无负环
        }
    }
    return 1;//返回1为正常,0为有负环
}
#define M 200000  //手动模拟
int q[M];
bool spfa(int s){
    int i,now,ne,t;
    memset(in,0,sizeof(in));
    memset(havein,0,sizeof(havein));
    memset(d,0x3f,sizeof(d));
    int l,r,len;l=r=len=0;
    long long sum=0;
    d[s]=0;in[s]=havein[s]=1;
    q[r++]=s;len++;
    while(l!=r){
        now=q[l++];
        if(l==M)l=0;
        if(d[now]*len>sum){//LLL
            q[r++]=now;
            if(r==M)r=0;
            continue;
        }
        len--; sum-=d[now]; in[now]=0;
        for(i=first[now];~i;i=Next[i]){
            ne=u[i];
            if(d[ne]<=(t=d[now]+w[i]))continue;
            d[ne]=t;
            if(in[ne])continue;
            in[ne]=1;
            if(t<=d[q[l]]){ //SLF
                if(--l<0)l=M-1;
                q[l]=ne;
            }
            else{
                q[r++]=ne;
                if(r==M)r=0;
            }
            len++; sum+=t;
            if(++havein[ne]>n)return 0;
        }
    }
    return 1;//返回1为正常,0为有负环
}
void init()//边初始化
{
    cnt=0;
    memset(first,-1,sizeof(first));
}
时间: 2024-12-26 22:14:42

spfa优化 SLF LLL的相关文章

UVa 10986:Sending email (Dijkstra优化, SPFA)

链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1927 题目: Problem E Sending email Time Limit: 3 seconds "A new internet watchdog is creating a stir in Springfield. Mr. X, i

SPFA算法学习笔记

一.理论准备         为了学习网络流,先水一道spfa.         SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在于意识到:只有那些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变.为什么队列为空就不改变了呢?就是因为要到下一点必须经过它的前一个邻接点..SPFA可以处理负权边.很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之

彻底弄懂最短路径问题

        只想说:温故而知新,可以为师矣.我大二的<数据结构>是由申老师讲的,那时候不怎么明白,估计太理论化了(ps:或许是因为我睡觉了):今天把老王的2011年课件又看了一遍,给大二的孩子们又讲了一遍,随手谷歌了N多资料,算是彻底搞懂了最短路径问题.请读者尽情享用--         我坚信:没有不好的学生,只有垃圾的教育.不过没有人理所当然的对你好,所以要学会感恩. 一.问题引入         问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径--

飞鱼星路由器TCP/IP优化加速

任何的网络都有一定的带宽,如果带宽占满了,那么我们就无法再获得更快的体验,这时很多人都会选择添加一条新的线路,或是增加原本的带宽,其实不然,可以通过TCP/IP优化加速来解决这个问题,本篇以飞鱼星路由器为例分析. 一.解决这个问题的一个方法是优化现有技术方案.许多网络流量仍然基于TCP/IP.TCP提供了可靠有序的数据包传输,大多数Web应用.电子邮件和文件传输都使用这种协议.可是,TCP的流管理算法并不先进:如果网络或接收端无法处理发送的传输速度,其表现是出现丢包.超时或乱序数据包过多等问题,

详细图解Win7安装完成后简单优化教程

1.首先,调整下语言选项栏.去除"EN".挪到任务栏右边. 点击最小化→点击三角弹出菜单→点击"任务栏中的其他图标"以取消勾选. 2.关闭UAC.UAC是啥?见百科. 如果你只是一个电脑菜鸟,不建议你关闭UAC,因为你不一定对木马.病毒有充份的防范!不要在意那点提示,看起来是比较烦,其实它是善意的!就像你年迈的父母一样的唠叨,不是么? 当然,如果你是一位老鸟,有足够的能力,那就另当别论了~ 关闭步骤如图. 3.删除"操作中心"图标,即那个讨厌的小

注册表优化方法

系统注册表的简易优化方法 注册表是电脑的重要数据资源.优化注册表有利于系统的快速运行. 下面就来看一下我的注册表优化方法. 修改磁盘缓存加速XP 磁盘缓存对XP运行起着至关重要的作用,但是默认的I/O页面文件比较保守.所以,对于不同的内存,采用不同的磁盘缓存是比较好的做法. 3lian素材 到注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\IoPageLockLimi

h2 删数据 sql优化-h2数据库删除数据速度问题

问题描述 h2数据库删除数据速度问题 想删除h2数据库中某个表部分数据,但该表中有八千万左右数据,如何删除符合要求的一小部分数据呢?比如删除name以abc开头的数据,因为h2数据库我是通过web打开查看的,普通的Sql语句要执行很长很长时间,而且经常报内存不足,各位大神有没有什么优化的方法???求指点呀 解决方案 http://www.lc365.net/blog/b/32424/ 解决方案二: 因为没分了,不过谢谢能回答,对我其他的一些地方有帮助

图片原理与优化 如何在网站设计中发挥更好的效果

中介交易 SEO诊断 淘宝客 云主机 技术大厅 前言:该文收集了前辈们的一些关于图片优化的技巧,在此收拢到一起,对于各个方法的优化原理做了一些研究,希望能给大家对于图片优化这一块起到抛砖引玉的作用. 提到图片,我们不得不从位图开始说起,位图图像(bitmap),也称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的.这些点可以进行不同的排列和染色以构成一副图片.当放大位图时,可以看见赖以构成整个图像的无数单个方块. 常见的格式中JPG.PNG.GIF亦属于位图,所以它们的数据结构大致相

从一个小项目操作看Google中文优化的点滴

在上月底因公司一个项目需要,接到一个"突然"的任务,一个月时间将关键词上海无纺布袋.帆布袋操作到Google首页,并且保持稳定,现在回想,半个月过去了,中途的项目排名也是比较跌宕起伏,颇有些感受的,深深体会到SEO前辈告诉我的一句话:SEO重点是执行,不是策略;核心是管理,不是技术.现和大家一起分享之: 之前有一定操作历史的,共优化3个关键词,上海环保袋.上海无纺布袋和帆布袋www.sh-guichuan.com动态且客户站点,之后关键词在今年4月25日左右时间出现波动,之后就一直没有