原理:队列+松弛操作

将源点加入队尾,每一步读取队头顶点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. hdu 1754 I Hate It (线段树)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 线段树的模板题,详细的都写在代码里了 //不知道为什么定义单个字符,用%c输入会超时,换成字符数 ...

  2. java日志管理 - slf4j+log4j2

    1 . 概述 1.1  日志框架实现 log4j是apache实现的一个开源日志组件: logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j ...

  3. WPF+MVVM+EF示例1

    实现了那些功能,先看看效果图: 项目工程目录: 接下来开始具体的步骤: 第一步:在VS中新建工程 第二步:使用NuGet 安装EntityFramework 第三步:使用NuGet 安装EntityF ...

  4. 启发式搜索——A*算法

    启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...

  5. C++ 赋值函数为什么返回reference to *this?

    赋值操作为什么要返回 reference to *this? 要弄清这个问题之前,先了解函数的返回值类型:返回值类型,返回引用类型 返回值类型:返回的是一个对象的副本. test operator= ...

  6. 你所不知道的Mac截图的强大

    Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图 1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+ ...

  7. 获取请求header的各种方法

    部分代码非原创  不定期更新 PHP function get_all_header() { // 忽略获取的header数据.这个函数后面会用到.主要是起过滤作用 $ignore = array(' ...

  8. jeecmsv9-adminVue 打包出错

    F:\jeecms\jeecmsv9-adminVue>node build\build.js - building for production...Error processing file ...

  9. java记录CST时间类型的字符串转换问题

    下列代码可以实现把Java的CST格式的时间字符串转为为Date对象和所需要的日期时间格式! String dateStr = "Wed Sep 16 11:26:23 CST 2009&q ...

  10. Leetcode500.Keyboard Row键盘行

    给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", "Dad& ...