spfa_队列

spfa:
1.当给定的图存在负权边时,Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了.
2.我们约定有向加权图G不存在负权回路,即最短路径一定存在
3.思路:
用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
4.实现方法:
建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空.
代码:

View Code
  1 #include <iostream>
  2 #include <memory.h>
  3 #include <stdio.h>
  4 #include <queue>
  5 using namespace std;
  6 const int maxp=1000;
  7 const int maxe=1000;
  8 const int maxnum=1000;
  9 struct edge
 10 {
 11     int v;
 12     int w;
 13     int next;
 14 }edge[maxe];
 15 
 16 typedef struct
 17 {
 18     int d;
 19     int pre;
 20 }pp;
 21 pp point[maxp];
 22 int p,e;
 23 
 24 queue<int> q;
 25 bool use[maxp];
 26 
 27 void Init()
 28 {
 29     int i;
 30     for(i=1;i<=p;i++)
 31     {
 32         point[i].d=maxnum;
 33         point[i].pre=-1;
 34     }
 35     int u,v,w;
 36     int index=1;
 37     for(i=1;i<=e;i++)
 38     {
 39         cin>>u>>v>>w;
 40         edge[index].v=v;
 41         edge[index].w=w;
 42         edge[index].next=point[u].pre;
 43         point[u].pre=index;
 44         index++;
 45     }
 46 }
 47 
 48 void spfa(int s)
 49 {
 50     memset(use,false,sizeof(use));
 51     point[s].d=0;
 52     q.push(s);
 53     use[s]=true;
 54     int t,i;
 55     while(!q.empty())
 56     {
 57         t=q.front();
 58         use[t]=false;
 59         q.pop();
 60         for(i=point[t].pre;i!=-1;i=edge[i].next)
 61         {
 62             int v=edge[i].v;
 63             int w=edge[i].w;
 64             if(point[v].d>point[t].d+w)
 65             {
 66                 point[v].d=point[t].d+w;
 67                 if(!use[v])
 68                 {
 69                     q.push(v);
 70                     use[v]=true;
 71                 }
 72             }
 73         }
 74     }
 75 }
 76 
 77 int main()
 78 {
 79     cin>>p>>e;
 80     Init();
 81     spfa(1);
 82     int i;
 83     for(i=1;i<=p;i++)
 84         cout<<i<<" "<<point[i].d<<endl;
 85     return 0;
 86 }
 87 
 88 /*
 89 5 10
 90 1 2 10
 91 1 3 5
 92 2 3 2
 93 2 4 1
 94 3 2 3
 95 3 4 9
 96 3 5 2
 97 4 5 4
 98 5 1 7
 99 5 4 6
100 */

 5.判断有无负环:如果某个点进入队列的次数超过N次则存在负环 ( 存在负环则无最短路径,如果有负环则会无限松弛,而一个带n个点的图至多松弛n-1次)

转载于:https://www.cnblogs.com/pushing-my-way/archive/2012/08/05/2624271.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat配置解析

Tomcat文件配置 tomcat解压后目录 bin&#xff1a;可执行文件&#xff08;startup.bat shutdown.bat) conf&#xff1a;配置文件&#xff08;server.xml&#xff09; lib&#xff1a;tomcat依赖的jar文件 log&#xff1a;日志文件&#xff08;记录出错等信息&#xff09; temp&…

教你配置安全的ProFTPD服务器(中)

二、 基本加固ProFTPD服务器步骤 1.升级版本 注&#xff1a;如果当前版本已经是最新版本&#xff0c;可以跳过第一步。 升级陈旧的ProFTPD版本&#xff0c;因为早期的ProFTPD版本存在的安全漏洞。对于一个新配置的ProFTPD服务器来说使用最新稳定版本是最明智的选择&#xff0c;…

Java 将Word转为PDF、PNG、SVG、RTF、XPS、TXT、XML

同一文档在不同的编译或阅读环境中&#xff0c;需要使用特定的文档格式来打开&#xff0c;通常需要通过转换文档格式的方式来实现。下面将介绍在Java程序中如何来转换Word文档为其他几种常见文档格式&#xff0c;如PDF、图片png、svg、xps、rtf、txt、xml等。 使用工具&#xf…

CentOS7上GitLab的使用

生成SSH Keys 生成root账号的ssh key # ssh-keygen -t rsa -C "adminexample.com" 显示pub key的值 # cat ~/.ssh/id_rsa.pub 复制显示出来的 pub key 以root账号登陆gitlab&#xff0c;点击 "profile settings" 然后点击 "SSH Keys" 将复制的pu…

数据库:除运算

除运算 设关系R除以关系S的结果为关系T&#xff0c;则T包含所有在R但不在S中的属性及其值&#xff0c;则T的原则与S的元组的所有组合都在R中。用象集来定义除法&#xff1a;给定关系R&#xff08;X&#xff0c;Y&#xff09;和S&#xff08;Y&#xff0c;Z&#xff09;。其中X&…

[图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

[图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html tensorflow使用了自动化构建工具bazel、脚本语言调用c或cpp的包裹工具swig、使用EIGEN作为矩阵处理工具、Nvidia-cuBLAS GPU加速计算库、结构化数据存储格式…

现共收到 5 个分组,其目的地址分别为: (1) 128.96.40.10 (2) 128.96.41.12 (3) 128.96.41.151 (4) 192.4.123.17 (5) 192.4.

计算目的地址的下一跳&#xff1a; 设某路由器建立了如表 1 所示路由表。现共收到 5 个分组&#xff0c;其目的地址分别为&#xff1a;(1) 128.96.40.10(2) 128.96.41.12(3) 128.96.41.151(4) 192.4.123.17(5) 192.4.123.90试分别计算下一跳解答&#xff1a; 用目的IP地址和路由…

【转】Docker学习_本地/容器文件互传(5)

1、查找所有容器 #docker ps a 2、找出我们想要的容器名字并查找容器长ID #docker inspect -f {{.ID}} python 3、拷贝本地文件到容器 docker cp 本地路径 容器长ID:容器路径docker cp /Users/xubowen/Desktop/auto-post-advance.py 38ef22f922704b32cf2650407e16b146bf61c221…

数据流图典型例题

数据流图典型例题 1.假设一家工厂的采购部每天需要一张订货报表&#xff0c;报表按零件编号排序&#xff0c;表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下列数据&#xff1a;零件编号、零件名称、订货数量、目前价格、主要供应商、次要供应商。零件…

白盒测试的逻辑覆盖辨析(语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖)

白盒测试逻辑覆盖&#xff08;语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖&#xff09; 逻辑覆盖测试&#xff1a; 语句覆盖&#xff1a;每条语句至少执行一次判定覆盖&#xff1a;每一判定的每个分支至少执行一次条件覆盖&#xff1a;每一判定中的每个条件&…

03 CSS听课笔记

CSS&#xff1a;页面美化和布局控制 1. 概念&#xff1a; Cascading Style Sheets 层叠样式表层叠&#xff1a;多个样式可以作用在同一个html的元素上&#xff0c;同时生效 2. 好处&#xff1a;(1)功能强大(2)将内容展示和样式控制分离   * 降低耦合度。解耦   * 让分工协作…

安装MySQL时出现“服务没有响应控制功能。请键入 NET HELPMSG 2186 以获得更多的帮助。”的问题解决

安装MySQL时出现“服务没有响应控制功能”的问题解决第一步&#xff1a;设置环境变量第二步&#xff1a;初始化my.ini第三步&#xff1a;添加文件第一步&#xff1a;设置环境变量 安装MySQL时&#xff0c;运行“net start mysql”时出现“服务没有响应控制功能。请键入 NET HE…

时间序列模型——ARIMA模型实现预测

ARIMA模型和因子预测 文章目录ARIMA模型和因子预测一、ARIMA模型&#xff08;整个周期&#xff09;1.数据预处理2.展示时序图2.数据建模&#xff08;1&#xff09;差分d&#xff08;2&#xff09;p和q&#xff08;3&#xff09;选择模型&#xff08;4&#xff09;检验残差序列&…

线段树 离散化

题目一&#xff1a;E. Infinite Inversions 这个题目没什么思维量&#xff0c;还比较简单&#xff0c;就是离散化要加上每一个值的后面一个值&#xff0c;然后每一个值放进去的不是1 &#xff0c;而是这个值与下一个点的差值。 因为这个数代表了一堆数&#xff0c;然后每一次的…

时序模型——如何用Python进行时序模型预测的baseline预测(简单规则)

时序模型——如何用Python进行时序模型预测的baseline预测&#xff08;简单规则&#xff09; 在对时间序列问题进行建模预测之前&#xff0c;通常可以通过一些简单的规则对结果进行提前的预测&#xff0c;可以作为baseline&#xff0c;供之后的模型进行参考。很多数据分析的比…

简单关联规则算法例题-9个顾客的编号为(T1,T2,T3,T4,T5,T6,T7,T8,T9),每一个顾客购买的商品记录{{I1,I2,I5}...},并使用python实现简单关联规则

题目&#xff1a; 简单关联规则算法例题-9个顾客的编号为&#xff08;T1,T2,T3,T4,T5,T6,T7,T8,T9&#xff09;,每一个顾客购买的商品记录{{I1,I2,I5},{I2,I4},{I2,I3},{I1,I2,I4},{I1,I3},{I2,I3},{I1,I3},{I1,I2,I3,I5},{I1,I2,I3}}&#xff0c;求频繁项集&#xff1b;并用py…

ASP.NET AJAX (Atlas) 拖放(Drag Drop)功能6种实现方法总结

在Ajax程序中实现传统桌面程序中异常简单的拖放功能却并不是件容易的事情。然而Web上的拖放功能又如此的让人痴迷&#xff0c;所以几乎每个成熟的Ajax类库都提供了自己的一套实现拖放的封装&#xff0c;ASP.NET AJAX (Atlas) 自然也不例外。本文将总结并简要分析ASP.NET AJAX (…

python实现决策树-数据集如下图所示,根据我们对决策树的理解,设计一棵决策树,并输入{Age:36,Salary:H,STU:No,Credit:OK} 测试数据,是否与预期结果一致?

题目&#xff1a;数据集如下图所示&#xff0c;根据我们对决策树的理解&#xff0c;设计一棵决策树&#xff0c;并输入{Age:36,Salary:H,STU:No,Credit:OK} 测试数据&#xff0c;是否与预期结果一致&#xff1f;注意&#xff0c;不允许直接调用Sklearn提供的决策树方法 决策树算…

047 一维数据的格式化和处理

目录 一、概述二、数据组织的维度2.1 从一个数据到一组数据2.2 维度&#xff1a;一组数据的组织形式2.3 一维数据2.4 二维数据2.5 多维数据2.6 高维数据2.7 数据的操作周期三、一维数据的表示3.1 如果数据间有序&#xff1a;使用列表类型3.2 如果数据间无序&#xff1a;使用集合…

jupyter中中文显示不正常_jupyter画图中文显示乱码问题解决办法

问题&#xff1a;为什么Jumpy中运行图片无法正常显示中文字体&#xff1f; 在使用jumpy运行可视化代码时&#xff0c;发现图片无法正常显示中文符号&#xff0c;在尝试网上诸多方法后&#xff0c;发现只需加一行代码即可解决 解决方法&#xff1a; 可以查看一下代码中是否存…