当前位置: 首页 > 编程日记 > 正文

图论-最短路径--3、SPFA算法O(kE)

SPFA算法O(kE)
主要思想是:
    初始时将起点加入队列。每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队。直到队列为空时算法结束。
    这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法。
SPFA 在形式上和广度优先搜索非常类似,不同的是广度优先搜索中一个点出了队列就不可能重新进入队列,但是SPFA中一个点可能在出队列之后再次被放入队列,也就是说一个点修改过其它的点之后,过了一段时间可能会获得更短的路径,于是再次用来修改其它的点,这样反复进行下去。
算法时间复杂度:O(kE)E是边数。K是常数,平均值为2
算法实现:
    dis[i]记录从起点si的最短路径,w[i][j]记录连接ij的边的长度。pre[v]记录前趋。
    team[1..n]为队列,头指针head,尾指针tail
    布尔数组exist[1..n]记录一个点是否现在存在在队列中。
    初始化:d[s]=0,d[v]=∞(vs),memset(exist,false,sizeof(exist));
    起点入队team[1]=s; head=0; tail=1;exist[s]=true;
    do
    {1、头指针向下移一位,取出指向的点u
    2、exist[u]=false;已被取出了队列
    3、foru相连的所有点v  //注意不要去枚举所有点,用数组模拟邻接表存储
       if (d[v]>d[u]+w[u][v])
         {   d[v]=d[u]+w[u][v];
             pre[v]=u;
             if (!exist[v]) //队列中不存在v点,v入队。
               {         //尾指针下移一位,v入队;
                    exist[v]=true;
                 }
          }
    }
    while (head < tail);
循环队列:
采用循环队列能够降低队列大小,队列长度只需开到2*n+5即可。例题中的参考程序使用了循环队列。
 1 #include<iostream>
 2 #include<cstdio>
 3 #define N 2010
 4 #include<cstring>
 5 using namespace std;
 6 int dis[N];  //起点到其他点的最短路径 
 7 int pre[N];  //前驱 
 8 int map[N][N];  //两点之间距离 
 9 int ans[N];  //输出 
10 int team[N];  //队列 
11 bool pd[N];  //判断是否在队列中 
12 int head,tail,n,m,from,to;  
13 void work(int a)
14 {
15     team[tail++]=a;
16     pre[a]=a;
17     dis[a]=0;
18     pd[a]=1;
19     while(head<tail)
20     {
21         int d=team[head];  //取出队首元素
22         for(int i=1;i<=n;++i)
23             if(map[d][i]!=0&&dis[i]>dis[d]+map[d][i])
24             {
25                 dis[i]=dis[d]+map[d][i];
26                 pre[i]=d;
27                 if(!pd[i])
28                 {
29                     team[++tail]=i;
30                     pd[i]=1;
31                 }
32             }
33         head++;
34         pd[d]=0;
35     }
36     printf("%d\n",dis[to]);    
37 }
38 void print(int a,int b)
39 {
40     ans[1]=to;
41     int top=1;
42     int t=b;
43     while(t!=from)
44     {
45         t=pre[t];
46         ans[++top]=t;
47     }
48     for(int i=top;i>=2;--i)
49         printf("%d->",ans[i]);
50     printf("%d",ans[1]);
51 }
52 int main()
53 {
54     memset(dis,0x7f,sizeof(dis));  //初始化 
55     cin>>n>>m;
56     for(int i=1;i<=m;++i)
57     {
58         int x,y,q;
59         scanf("%d%d%d",&x,&y,&q);
60         map[x][y]=q;  //有向图 
61     }
62     cin>>from>>to;  //需要计算的两点 
63     work(from);
64     print(from,to);
65     return 0;
66 }

转载于:https://www.cnblogs.com/mjtcn/p/6689624.html

相关文章:

如何在HHDI中进行数据质量探查并获取数据剖析报告

通过执行多种数据剖析规则&#xff0c;对目标表&#xff08;或一段SQL语句&#xff09;进行数据质量探查&#xff0c;从而得到其数据质量情况。目前支持以下几种数据剖析类型&#xff0c;分别是&#xff1a;数字值分析、值匹配检查、字符值分析、日期值分析、布尔值分析、重复值…

html5网页怎么实现内容追加,纯js实现网页内容复制后自动追加自定义内容

网页操作内容复制内容后纯js实现监听自动追加自定义内容不少网站技术或者博客上有这样的处理&#xff0c;当我们复制代码的时候&#xff0c;会自动加上一段本信息版权为XXXX&#xff0c;这是怎么实现的呢&#xff1f;其实实现的方式很简单&#xff0c;可以在我的网站页面上绑定…

ios Standard Framework和Umbrella Framework

Standard Framework&#xff1a;标准库&#xff0c;通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类)&#xff0c;只需要暴露对应的header文件到Header文件夹下即可&#xff0c;不强制引用master header文件…

Win7使用Visual Studio 2010编译用于Qt4.8.6的MySQL驱动

其实编译过程在Qt Creator 的帮助文档里有&#xff0c;我就是照着做的&#xff0c;但是没成功&#xff0c;因为不能照搬照抄&#xff01; 1.确保path环境变量里有QTDIR&#xff0c;这个就不细说了。 2.打开"开始"->"Microsoft Visual Studio 2010"->…

ios 常见性能优化

1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片大小 7. 选择正确的Collection 8. 打开gzip压缩 9. 重用和延迟加载Views 10. Cache, Cache, 还是Cache&#xff01; 11. 权衡渲染方…

强化学习(七)时序差分离线控制算法Q-Learning

在强化学习&#xff08;六&#xff09;时序差分在线控制算法SARSA中我们讨论了时序差分的在线控制算法SARSA&#xff0c;而另一类时序差分的离线控制算法还没有讨论&#xff0c;因此本文我们关注于时序差分离线控制算法&#xff0c;主要是经典的Q-Learning算法。 Q-Learning这一…

react遇到的各种坑

标签里用到<label for>的&#xff0c;for 要写成htmlFor标签里的class要写成className组件首字母一定要大写单标签最后一定要闭合如果html里要空格转义&#xff0c; 注意不要漏了分号;style要写成style{{clear: both,backgroundColor:red,width:200px}}组件里能用<but…

html页面视频标签,html5基础标签(html5视频标签 html5新标签用法)

点评&#xff1a;html5基础&#xff0c;包括html5视频标签和html5新标签等标签用法&#xff0c;大家参考使用吧1、 声明的变化2、 指定字符编码的变化&#xff0c;html5中建议使用utf-83、 Html5中允许没有结束符&#xff0c;不算错误4、 不允许写结束标记的有&#xff1a;…

chronyd服务

一、makestep步进时间选项 最近做RHCE的实验&#xff0c;nfs用krb5p实现全程加密和身份认证&#xff0c;需要nfs服务端、客户端的时间与KDC的时间同步&#xff0c;否则kerberos分发的ticket就会失效&#xff0c;nfs不能挂载和访问。那么就需要在nfs的服务端、客户端都配置chro…

软件测试人员必备Linux命令(初、中、高级)

有些技能可以事半功倍&#xff0c;有些命运掌握在我们手中。熟练的掌握和使用这些命令可以提高工作效率&#xff0c;并且结合这些命令对测试过程中遇到的问题进行一些初步的定位。 1 目录与文件操作 1.1 ls(初级) 使用权限&#xff1a;所有人 功能 : 显示指定工作目录下之内容&…

酷派android手机怎么截屏,酷派S688怎么截屏截图?

夏普AQUOS S2事水滴全面屏&#xff0c;搭配骁龙630处理器&#xff0c;个人手里就是这货&#xff0c;目前售价千元内&#xff0c;按需求不高的人&#xff0c;可以考虑&#xff0c;不过系统不很行基于Android 7.1.1深度优化的Smile UX系统实在表现一般。~~~~根据美国FCC的认证信息…

01 多线程概念及其实现方式

多线程是编程过程里必不可少的内容&#xff0c;学习多线程&#xff0c;就先要了解进程和线程的概念。进程&#xff1a;是指当前正在运行的程序&#xff0c;是一个程序在内存里的执行区域&#xff1b;线程&#xff1a;是在进程里的一个执行控制单元&#xff0c;执行路径&#xf…

负载均衡层次分析

什么是负载均衡 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;将请求/数据【均匀】分摊到多个操作单元上执行&#xff0c;负载均衡的关键在于【均匀】。 常见的负载均衡方案 常见互联网分布式架构如上&#xff0c;分为客…

Python基础01-Python环境搭建与HelloWorld

目录 从今天开始学习Python Python环境搭建 安装gcc Python源码包安装 开始Python第一个代码HelloWorld&#xff01; 从今天开始学习Python 为啥选择Python&#xff0c;可能是跟随潮流吧。我现在不知道为什么学习Python&#xff0c;但是可能一年到一年半以后&#xff0c;…

oracle与mysql创建表时的区别

oracle创建表时&#xff0c;不支持在建表时同时增加字段注释。故采用以下方式&#xff1a; #创建表 CREATE TABLE predict_data as (id integer NOT NULL, uid varchar2(80),mid varchar2(80),time date ,conten…

在Linux上安装Memcached服务

下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载&#xff1a;http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz 另外&#xff0c;Memcache用到了libevent这个库用于Socket的处理&#xff0c;所以还需要安装libevent&#xff0c;libevent的最…

图形化编程 html,用GoJS实现图形化交互编程界面示例

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定function init() {var $ go.GraphObject.make; //for conciseness in defining node templatesmyDiagram $(go.Diagram, "myDiagramDiv", //Diagram refers to its DIV HTML element by id{"undoMan…

枚举位移计算操作

如&#xff1a; typedef NS_ENUM(NSInteger, Test) { // 十进制 二进制 TestA 1 << 0, // 1 00001 TestB 1 << 1, // 2 …

Python基础02-Python基础

脚本的第一行 Python脚本的第一行&#xff0c;写Python解释器的路径。这样就可以直接执行Python脚本。 脚本编码 Python2需要指定脚本的编码&#xff0c;Python3不需要指定。 # -*- coding:utf8 -*- 使用input做简单的交互 username input(请输入用户名密码:) password …

SpringBoot上传文件大小限制

SpringBoot默认上传文件大小不能超过1MB&#xff0c;超过之后会报以下异常&#xff1a; org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.at org.apache.tomcat.…

html实时显示log,websocketd 实现浏览器查看服务器实时日志

操作系统CentOS7下载 websocketd安装 nc 命令yum install nmap-ncat创建监听脚本cat > cmd.sh <#!/bin/bashpkill -x ncwhile :; donc -nkl 10088sleep 1done创建 log.htmlbody{background-color: #0e1012;color: #ffffff;}*{margin: 0; padding: 0;}#msg{overflow:auto;…

git 合并两个分支的某个文件

软件开发基本都是多个feature分支并行开发&#xff0c;而在上线前有可能某个分支的开发或测试还没有完成&#xff0c;又或者是产品调整&#xff0c;取消了该分支功能的上线计划&#xff0c;我们在release前不合并该分支即可&#xff0c;然而如果该分支中的某些小调整却需要上线…

lattice diamond 3.7安装破解

第一步安装&#xff1a;执行.EXE文件&#xff0c;一直下一步&#xff0c;最后license选择没有USB什么的那个&#xff08;具体记不清了&#xff09;。 第二步破解&#xff1a;安装完成后在环境变量中将license路径指定到license文件即可&#xff08;LM_LICENSE_FILE d:\lscc…

Python基础03-运算符

运算符 算数运算符 算数运算符符号运算数字用法举例字符串用法举例加a 2 3 print(a) # 5s1 "hello" s2 "world" s s1 s2 print(s) # helloworld-减a 12 - 3 print(a) # 9*乘a 12 * 3 print(a) # 36s1 "hello" s2 "world" s…

shell下的作业管理(转)

作业管理 举例来说&#xff0c;我们在登陆 bash 后&#xff0c; 想要一边复制文件、一边进行数据搜寻、一边进行编译&#xff0c;还可以一边进行 vi 程序撰写&#xff01; 当然我们可以重复登陆那六个文字介面的终端机环境中&#xff0c;不过&#xff0c;能不能在一个 bash 内达…

合并模拟器和真机的静态库动态库aggregate

创建Aggregate的target 在Build Phases 添加Run Script,内容为 scriptFile${SRCROOT}/universalA.shsh ${scriptFile} universalA.sh放在工程根目录&#xff0c;内容为&#xff1a; if [ "${ACTION}" "build" ]then echo "合并模拟器真机库" ta…

html表格联动,html前端基础:table和select操作

html前端基础&#xff1a;table和select操作发布时间&#xff1a;2020-05-13 09:58:10来源&#xff1a;亿速云阅读&#xff1a;196作者&#xff1a;Leah这篇文章主要为大家详细介绍html前端基础中有关table和select的操作&#xff0c;配合代码阅读理解效果更佳&#xff0c;非常…

Python基础04-数据类型:数字、布尔、字符串

目录 数字 布尔 字符串 字符串的常用函数 字符串的内存分析 字符串练习题 数字 判断是数字类型还是字符串类型。 # <class str> 123 a "123" print(type(a), a)# <class int> 123 b int(a) print(type(b), b) 十进制、二进制、八进制、十六进…

一起学Hadoop——实现两张表之间的连接操作

---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据&#xff08;一个文件可视为一张表&#xff0c;hive和关系型数据库Mysql、Oracle等都是将数据存储在文件中&#xff09;。但是我们经常会遇到处理多张表的场景&#xff0c;不同的数据存储在不同的文件中&…

scala学习笔记-过程、lazy值和异常(6)

过程 在Scala中&#xff0c;定义函数时&#xff0c;如果函数体直接包裹在了花括号里面&#xff0c;而没有使用连接&#xff0c;则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。 过程还有一种写法&#xff0c;就是将函数的返回值类型定…