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解法是将每条边遍历一次,遍历一次所有边可 ...
随机推荐
- 查看pip install *.whl 支持的文件版本
import pip._internalprint(pip._internal.pep425tags.get_supported())[('cp37', 'cp37m', 'manylinux2010 ...
- 19-11-05-Night
我就是不行. ZJ: 好像是因为郁闷了才咕掉的…… 33 Miemeng 30 00:01:34 40 00:01:46 0 00:01:22 70 00:01:46 不记得当时怎么想的 T1只会暴力 ...
- MyEclipse使用总结——Maven项目如何启动运行发布到tomcat中[转]
前面两篇文章: 新建maven框架的web项目 以及 将原有项目改成maven框架 之后,我们已经有了maven的项目 那么 maven项目到底怎么启动呢 如果我们直接在myeclipse中按以前的启 ...
- JDK源码阅读--HashMap
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, ...
- Ubuntu安装QQ、微信、微信开发者工具、搜狗输入法
wine 待补充……
- C++字符串前面加LR
const std::experimental::filesystem::path symbolsFilename = LR"(d:\fulongtech_git\draing_recogn ...
- Netty TCP粘包/拆包问题《二》
1.DelimiterBasedFrameDecoder:是以分隔符作为结束标志进行解决粘包/拆包问题 代码: EchoClient:客户端 /* * Copyright 2012 The Netty ...
- Windows API 第四篇 文件操作
创建或打开文件(也可用于打开管道,油槽,硬件设备等): HANDLE CreateFile( LPCTSTR lpFileName, // file name DWORD dwDesiredAcces ...
- 阿里云提供全托管 ZooKeeper
自 2010 年左右第一次引入以来,Apache ZooKeeper 目前在阿里巴巴集团内部已经有了将近 10 年的发展,使用的场景非常广泛,基于 ZooKeeper 强一致性的特点,被用在了分布式锁 ...
- Django项目:CRM(客户关系管理系统)--63--53PerfectCRM实现CRM客户报名流程缴费
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...