SPFA(Bellman-Ford队列优化)
原理:队列+松弛操作
将源点加入队尾,每一步读取队头顶点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队列优化)的更多相关文章
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)
/** problem: http://poj.org/problem?id=3259 spfa判负环: 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数) spfa双端队列优化: 维 ...
- bellman ford优先队列优化简介模板
#include<iostream>#include<cstdio>#include<utility>#include<queue>#include&l ...
- 关于SPFA的双端队列优化
7.11 Update 我做题的时候发现这样写会RE 因为在使用双端队列优化SPFA的时候 在将一个点加入队列的时候,如果队列已经空了 那么一旦出现dis[Q.front()]就会RE 可以这样修改 ...
- HDU 2544 最短路(floyd+bellman-ford+spfa+dijkstra队列优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找点1到点n的最短路(无向图) 练一下最短路... dijkstra+队列优化: #i ...
- Bellman-Ford算法及其队列优化(SPFA)
一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...
- SPFA队列优化
spfa队列优化(用来求最短路) 实现方法: 1.存入图.可以使用链式前向星或者vocter. 2.开一个队列,先将开始的节点放入. 3.每次从队列中取出一个节点X,遍历与X相通的Y节点,查询比对 ...
- 图论之最短路径(3)队列优化的Bellman-Ford算法(SPFA算法)
在Bellman-Ford算法中 我们可以看到大量的优化空间:如果一个点的最短路径已经确定了,那么它就不会再改变,因此不需要再处理.换句话说:我们每次只对最短路径改变了的顶点的所有出边进行操作 使用一 ...
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
随机推荐
- swiper 插件里面嵌套可滚动内容
在移动端使用swiper的整屏滚动,如果slide里面有滚动内容的话,滚动的时候会整个页面一起滚动,如果想里面的滚动区域单独滚动的话,可以在初始化swiper的时候添加上 noSwipingClass ...
- mui.fire()用法
作用: mui.fire() 可以触发目标窗口的自定义事件 mui.fire( 目标窗口的webview , '自定义事件名' ,{参数列表}:) 目标窗口监听这个自定义事件 window.addEv ...
- sed应用 升级场景配置文件更新 指定行追加
function addLine() { confFile=configuration.xml isExist=`cat ${confFile} | grep "<listen_ena ...
- HtmlHelper1
<div> @using(Html.BeginForm("Test","Default")) { 4 @Html.TextBox("nam ...
- 如何在Mac上切换python2和python3以及下载安装包 & 在Mac上如何查找系统自带python2.7的路径
电脑:系统是Mac OS 系统自带python2.7 自己下载安装了python3.6 问题:一开始我想在终端下执行python2的相关代码 例如 python kNN.py (kNN.py这 ...
- SPOJ - UOFTCG 树的最小路径覆盖
//SPOJ - UOFTCG 树的最小路径覆盖 #include <bits/stdc++.h> #include <vector> using namespace std; ...
- linux拆分文件
1.先看下文件总的行数: wc -l filename 我们现在来看看它具体的参数该怎么用: split支持自定义输出文件大小和输出文件行数两种模式,此外还可以定义每一行最大的值. -l 按输出文件行 ...
- windows下和linux下运行jar
需要在windows下运行jar,首先需要我们打包出来可执行jar idea打包可执行jar可以参考我的另一篇博客[https://mp.csdn.net/postedit/88653200] 一.w ...
- 微信小程序之组件的集合(六)
这个将是最后一篇关于小程序的记录了,课程接近尾声,最后一个是关于用户的page页面,看看这个页面中有哪些值得学习的地方! 一.page中my开发 这个主要是展示用户喜欢的杂志,以及用户的信息,需要创建 ...
- 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. ...