spfa

百度百科上spfa的思路为:动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
俗人的解释:用普通队列存点,每次抛出的点如果更新了周围邻居的距离并且这个点不在队列中,那么这个邻居点被更新了的就加入队列尾。一直到所有操作都不会改变邻居的距离,当队列为空时,当然,这可能要特殊处理有没有成负环(一般不会)。
百科上两个优化策略:

  • SPFA算法有两个优化策略SLF和LLL——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出队进行松弛操作。SLF 和 LLF 在随机数据上表现优秀,但是在正权图上最坏情况为 O(VE),在负权图上最坏情况为达到指数级复杂度。

蓝桥杯 最短路

这题用dijkstra过不了,只能用spfa.裸的spfa。
算法训练 最短路
时间限制:1.0s 内存限制:256.0MB

问题描述
给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式
第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i 1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定
对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。
JAVA代码:

package 算法训练;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
/** spfa算法*/
public class 最短路 {static int leng[];public static void main(String[] args) throws IOException {// TODO 自动生成的方法存根StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));in.nextToken();int n=(int)in.nval;in.nextToken();int m=(int)in.nval;List<node>list[]=new ArrayList[n];//存储路径for(int i=0;i<n;i++)//声明{list[i]=new ArrayList<>();}leng=new int[n];boolean jud[]=new boolean[n];//判断是否在队列内for(int i=1;i<n;i++) {leng[i]=Integer.MAX_VALUE;}//初始最长均为maxfor(int i=0;i<m;i++){in.nextToken();int u=(int)in.nval;in.nextToken();int v=(int)in.nval;in.nextToken();int l=(int)in.nval;list[u-1].add(new node(v-1, l));             }Queue<Integer>q1=new ArrayDeque<Integer>();q1.add(0);//第一个while(!q1.isEmpty()){int x=q1.poll();jud[x]=false;for(int i=0;i<list[x].size();i++)//遍历{int index=list[x].get(i).x;//x邻居该节点的编号int length=list[x].get(i).leng;//x到这个邻居的距离if(leng[index]>leng[x]+length){leng[index]=leng[x]+length;if(!jud[index])//队列中没有该点{q1.add(index);jud[index]=true;}                 }                   }}for(int i=1;i<n;i++){out.println(leng[i]);}out.flush();}static class node{int x;int leng;public node(int x,int leng){this.x=x;this.leng=leng;}}
}
  • 运行结果为

蓝桥杯最短路(java过)spfa单源最短路算法相关推荐

  1. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.      SPFA算法是西南交通大学段凡丁于1994年发表的.     从名 ...

  2. 1379:热浪(heatwv)(SPFA单源最短路)

    德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!! 他们的德克萨斯长角牛吃起来不错,可是它们并不是很擅长生产富含奶油的乳制品. 农夫John此时身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重 ...

  3. 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1​,...,Xn​ ...

  4. 单源最短路 Dijkstra算法 和 SPFA算法

    单源最短路 •从一个点出发,到达其他顶点的最短路径的长度. •基本操作:松弛 •d[u]+map[u, v]< d[v]这样的边(u,v)称为紧的(tense),可以对它进行松弛(relax): ...

  5. 2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数

    2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数 在线评测 Ideas 对于一个纯循环小数,假设循环节为l,则小数为0.llll-,转换为分数就是 l / (10 ** n ...

  6. 2013蓝桥杯java试题_蓝桥杯2013决赛java本科b组试题.doc

    蓝桥杯2013决赛java本科b组试题.doc 试题一:公式求值问题描述输入n,m,k,输出下面公式的值.其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如 ...

  7. java迷宫类编程题_第十届蓝桥杯省赛java类B组 试题 E:迷宫 (动态规划之回溯法)...

    问题描述 试题 E: 迷宫 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为 ...

  8. 第十二届蓝桥杯省赛JAVA B组杨辉三角形个人题解

    第十二届蓝桥杯省赛JAVA B组杨辉三角形个人题解(非满分) import java.util.Scanner; public class Main {public static void main( ...

  9. 蓝桥杯-Sine之舞-java

    蓝桥杯-Sine之舞-java 题目 问题描述最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的 ...

最新文章

  1. 截取指定网站Html编码
  2. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流
  3. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))
  4. ElementUI弹出新增窗口
  5. 安装ORACLE 11。2.0.3 配置GRID执行脚本信息记录
  6. 关于内容分发网络 CDN 的可靠性和冗余性
  7. mysql类型说明_MYSQL 数据类型说明
  8. 格式化代码php,格式化php代码的两种方法
  9. [Link]选择一个 Python Web 框架:Django vs Flask vs Pyramid
  10. !--more--搭建的博客设置主页内容高度
  11. js调用数科阅读器_pdf.js实现在HTML下直接浏览pdf文档,无需插件即可实现
  12. 用虚拟化平台建NAS服务器,虚拟化之NAS存储
  13. 电容笔和触控笔的区别是什么?好用的电容笔测评
  14. 学习python很无趣?看看这篇文章教你采集无水印美女视频(含视频教程)
  15. 如何在不激活电脑的情况验机
  16. php类和对象教程,php类和对象
  17. 杭电oj 1426 Sudoku Killer(深度优先搜索 回溯)
  18. 章泽天又晒27岁生日照:刚刚又重返18岁!
  19. STM32两轮自平衡小车物料采购清单
  20. Perl-字符串与排序2

热门文章

  1. 区块链BaaS云服务(7)微软Azure区块链服务
  2. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor续
  3. java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)
  4. 管理系统模板c语言,管理系统c语言
  5. 导入表注入原理和C语言实现
  6. vbs枚举磁盘访问磁盘信息
  7. crackMe的逆向分析
  8. Android 布局属性 Android:layout_weight 总结
  9. 2、MySQL使用(DISTINCT)过滤重复数据
  10. 【PAT乙级】1036 跟奥巴马一起编程 (15 分)