原理:队列+松弛操作

将源点加入队尾,每一步读取队头顶点u,并将队头顶点u出队(记得消除标记);将与点u相连的所有点v进行松弛操作,如果能更新距离(即令d[v]变小),那么就更新,另外,如果点v没有在队列中(打个标记),那么要将点v入队,如果已经在队列中了,那么就不用入队

以此循环,直到队空为止就完成了单源最短路的求解

判断有无负环:

如果某个点进入队列的次数超过N次则存在负环

/****************************************************************************************************

                            最短路—Bellman-Ford算法队列优化(SPFA)邻接表
将边权替换为概率,相加改为相乘,最短距离改为最大概率 ********************************************************************************************************/
#include<cstdio>
#include<queue>
#define maxint 99999999
#define maxn 10005
#define eps 1e-8
using namespace std;
struct Edge{
int next,to;
double power;
}e[maxn*];//保存边
double dist[maxn];// 结点到源点最小距离(最大概率)
int ed[maxn];//邻接表
int n,m,source=,c[maxn];// 结点数,边数,源点,记录进队次数
bool vis[maxn];//判断是否在队列中
queue<int> q;
void in(){// 初始化图
scanf("%d%d",&n,&m);// 输入结点数,边数
for(int i=;i<=n;i++)dist[i]=;//初始化刚开始距离为最大(概率为最小)
dist[source]=;//到源点最小距离为0(概率为1)
int x,j;
for(int i=;i<=m;i++){
j=i<<;
scanf("%d%d%lf",&x,&e[j].to,&e[j].power);e[j].power/=;
e[j].next=ed[x];ed[x]=j;
e[j+].to=x;e[j+].next=ed[e[j].to];ed[e[j].to]=j+;e[j+].power=e[j].power;
}
}bool SPFA(int s){
q.push(s);vis[s]=,c[s]=;
while(!q.empty()){
int x=q.front();q.pop();vis[x]=;
int i=ed[x];
while(i){
int j=e[i].to;
if(dist[x]*e[i].power-eps>dist[j]){
dist[j]=dist[x]*e[i].power;//松弛
vis[j]=;//标记
c[j]++;q.push(j);//入队
if(c[j]>n)return ;//有负环
}
i=e[i].next;
}
}
return ;
}
int Perseverance(){
freopen("toura.in","r",stdin);
freopen("toura.out","w",stdout);
in();
if(SPFA())
printf("%.6lf",dist[n]*);
return ;
}
int comeon=Perseverance();
int main(){
return ;
}

两个优化

SLF(Small Label First): 设要加入的节点是j,队首元素为i,若dist(j) < dist(i),则将j插入队首,否则插入队尾。 
LLL(Large Label Last):设队首元素为i,每次弹出时进行判断,队列中所有dist值的平均值为x,若dist(i)>x则将i插入到队尾,查找下一元素,直到找到某一i使得dist(i)<=x,则将i出对进行松弛操作。

SPFA(Bellman-Ford队列优化)的更多相关文章

  1. poj1860 bellman—ford队列优化 Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22123   Accepted: 799 ...

  2. poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)

    /** problem: http://poj.org/problem?id=3259 spfa判负环: 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数) spfa双端队列优化: 维 ...

  3. bellman ford优先队列优化简介模板

    #include<iostream>#include<cstdio>#include<utility>#include<queue>#include&l ...

  4. 关于SPFA的双端队列优化

    7.11 Update 我做题的时候发现这样写会RE 因为在使用双端队列优化SPFA的时候 在将一个点加入队列的时候,如果队列已经空了 那么一旦出现dis[Q.front()]就会RE 可以这样修改 ...

  5. HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...

  6. Bellman-Ford算法及其队列优化(SPFA)

    一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...

  7. SPFA队列优化

    spfa队列优化(用来求最短路) 实现方法: 1.存入图.可以使用链式前向星或者vocter. 2.开一个队列,先将开始的节点放入. 3.每次从队列中取出一个节点X,遍历与X相通的Y节点,查询比对   ...

  8. 图论之最短路径(3)队列优化的Bellman-Ford算法(SPFA算法)

    在Bellman-Ford算法中 我们可以看到大量的优化空间:如果一个点的最短路径已经确定了,那么它就不会再改变,因此不需要再处理.换句话说:我们每次只对最短路径改变了的顶点的所有出边进行操作 使用一 ...

  9. ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

    两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...

随机推荐

  1. swiper 插件里面嵌套可滚动内容

    在移动端使用swiper的整屏滚动,如果slide里面有滚动内容的话,滚动的时候会整个页面一起滚动,如果想里面的滚动区域单独滚动的话,可以在初始化swiper的时候添加上 noSwipingClass ...

  2. mui.fire()用法

    作用: mui.fire() 可以触发目标窗口的自定义事件 mui.fire( 目标窗口的webview , '自定义事件名' ,{参数列表}:) 目标窗口监听这个自定义事件 window.addEv ...

  3. sed应用 升级场景配置文件更新 指定行追加

    function addLine() { confFile=configuration.xml isExist=`cat ${confFile} | grep "<listen_ena ...

  4. HtmlHelper1

    <div> @using(Html.BeginForm("Test","Default")) { 4 @Html.TextBox("nam ...

  5. 如何在Mac上切换python2和python3以及下载安装包 & 在Mac上如何查找系统自带python2.7的路径

    电脑:系统是Mac OS  系统自带python2.7  自己下载安装了python3.6 问题:一开始我想在终端下执行python2的相关代码   例如 python kNN.py (kNN.py这 ...

  6. SPOJ - UOFTCG 树的最小路径覆盖

    //SPOJ - UOFTCG 树的最小路径覆盖 #include <bits/stdc++.h> #include <vector> using namespace std; ...

  7. linux拆分文件

    1.先看下文件总的行数: wc -l filename 我们现在来看看它具体的参数该怎么用: split支持自定义输出文件大小和输出文件行数两种模式,此外还可以定义每一行最大的值. -l 按输出文件行 ...

  8. windows下和linux下运行jar

    需要在windows下运行jar,首先需要我们打包出来可执行jar idea打包可执行jar可以参考我的另一篇博客[https://mp.csdn.net/postedit/88653200] 一.w ...

  9. 微信小程序之组件的集合(六)

    这个将是最后一篇关于小程序的记录了,课程接近尾声,最后一个是关于用户的page页面,看看这个页面中有哪些值得学习的地方! 一.page中my开发 这个主要是展示用户喜欢的杂志,以及用户的信息,需要创建 ...

  10. SolrCloud4.7.1分布式部署

    一.环境 软件: apache-tomcat-7.0.53.tar.gz solr-4.7.1.tgz zookeeper-3.4.6.tar.gz   规划: 三个节点IP: 192.168.50. ...