问题描述
给定一个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,保证从任意顶点都能到达其他所有顶点。

喜欢这种直接的题,没有任何修饰,直切主题

所以作为一道纯粹介绍Bellman-Ford算法的题来解决图中如果含有负边的情况,也因而往往出现在有向图中,(假设是有向图且存在负边,那么我们只要一直在这条边上来回移动,便会一直趋向于无穷小)
直接上代码:

import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Stack;public class Main
{   public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();Edge list[]=new Edge[m];//需要记录m条边的信息for(int i=0;i<m;i++){list[i]=new Edge(sc.nextInt(),sc.nextInt(),sc.nextInt());}int d[]=new int[n+1];for(int i=1;i<=n;i++)d[i]=Integer.MAX_VALUE;d[1]=0;//求的是从1到其他所有点的最短路for(int k=0;k<n-1;k++)for(int i=0;i<m;i++){int x=list[i].from;int y=list[i].to;if(d[x]<Integer.MAX_VALUE)//必须是从之前经过处理的点开始d[y]=Math.min(d[y], d[x]+list[i].w);}for(int i=2;i<=n;i++)System.out.println(d[i]);}
}
class Edge
{int from;//起点int to;//终点int w;Edge(int from,int to,int w){this.from=from;this.w=w;this.to=to;}
}

可以思考一下这个算法与Dijkstra算法的区别(详情见上一篇)在Dijstra算法中有一个mark数组的标志量用来观测 一个点是否经过处理,但是这里没有,其原因就是有负权的存在,假设,存在一个负值极大的一条边(但不构成负环)且里这个点非常远,那么即使如此,我们也是需要去考虑这条边,因为 加入了这条边可能会使整个最短路跟小,所以每次我们都需要去遍历边。所以不需要mark。

优化:用队列代替循环检查

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main
{   static ArrayList<Edge>list[];static int n,m,d[],inq[],cnt[],p[];public static void main(String[] args) {Scanner sc=new Scanner(System.in);n=sc.nextInt();m=sc.nextInt();d=new int[n+1];inq=new int[n+1];cnt=new int[n+1];//p=new int[n+1];list=(ArrayList<Edge>[])new ArrayList[n+1];for(int i=0;i<m;i++){int u=sc.nextInt();int v=sc.nextInt();int w=sc.nextInt();if(list[u]==null)list[u]=new ArrayList<>();list[u].add(new Edge(v,w));//建图}}static boolean BellmanFord(int s){Queue<Integer> queue=new LinkedList<>();for(int i=1;i<=n;i++)d[i]=Integer.MAX_VALUE;d[s]=0;inq[s]=1;queue.add(s);while(!queue.isEmpty()){int x=queue.remove();inq[x]=0;for(int i=0;i<list[x].size();i++){Edge e=list[x].get(i);if(d[x]<Integer.MAX_VALUE&&d[e.to]>d[x]+e.w){d[e.to]=d[x]+e.w;if(inq[e.to]==0){queue.add(e.to);inq[e.to]=1;if(++cnt[e.to] > n){return false;}}}}}return true;}
}
class Edge//如果需要建图就不需要from
{int to;int w;Edge(int to,int w){this.w=w;this.to=to;}
}

最小路(Bellman-Ford算法)(负权情况)相关推荐

  1. bellman ford 算法 判断是否存在负环

    Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统        程序员11月书讯,评论得书啦        Get IT技能知识库,50个领域一键直达 关闭 bellman for ...

  2. bellman - ford算法c++

    (最短路III)bellman - ford算法(适用于含负权边的图) 注意:用该算法求最短路,在有边数限制的情况下可以存在负权回路!且对所走的边的数量有要求时只能用该算法实现! 解析:因为如果没有边 ...

  3. Bellman Ford算法详解

    一.用途 1. Bellman Ford算法是解决拥有负权边最短路问题的方法之一.还有一种方法是SPFA算法. 2. 二者相比,SPFA算法在效率方面是优于Bellman Ford算法的.但在某些情况 ...

  4. Bellman——Ford算法

    Bellman--Ford 算法介绍 思路讲解 案例分析与代码实现 案例分析 代码实现 优先队列优化(SPFA) 优化原理 代码实现 算法介绍 我们知道Dijkstra算法只能用来解决正权图的单源最短 ...

  5. Bellman ford算法(贝尔曼·福特算法)

    Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...

  6. bellman ford 算法

    Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求解最短 ...

  7. 单源最小路径BellMan Ford算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法. 输入:带权图 输出:从第0个点到其他点的最短路径值 B ...

  8. LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)

    文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...

  9. c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序

    匿名用户 1级 2010-06-01 回答 //这个是邻接表 typedef struct oo { int len,num; struct oo *next; } link; typedef str ...

最新文章

  1. asp.net出现:当前标识(NT AUTHORITY\NETWORK SERVICE)没有对' '的写访问权限。
  2. ON DUPLICATE KEY UPDATE 用法与说明
  3. glassfish发布应用_WildFly 8与GlassFish 4 –选择哪个应用服务器
  4. 【华为云技术分享】全WEB化开发体验,开发者新利器华为云CloudIDE即将揭秘
  5. 解决Error: Protected multilib versions:
  6. 百度景鲲:9月15日发布小度真无线智能耳机
  7. Kudu 使用注意点
  8. Python[8] :paramiko模块多进程批量管理主机
  9. axure7 地址选择_Axure教程:省市县三级联动选择(全国省市区数据)
  10. Oracle sqluldr2
  11. 静态代理、JDK与Cglib动态代理简单实现
  12. 检验检测机构LIMS系统应用
  13. python使用pip
  14. 华为腾讯众安微众360大咖齐聚,2019中国区块链开发者大会等你来!
  15. 学废了系列 - WebGIS vs WebGL图形编程
  16. 学习OpenCV3:Cmake+MinGW编译OpenCV
  17. 23种设计模式-个人笔记(二)
  18. htmlunit 示例
  19. 国际法方向的论文选题能选什么?
  20. 丁俊晖入交大,无悖于“读书无用”论

热门文章

  1. SAP ABAP 客户主数据的 查询-创建-修改-锁定 API或BAPI
  2. windows常用cmd指令
  3. Matlab非线性优化函数fmincon
  4. 【JQ+html+css】我的购物车-品优购(案例实现)
  5. 59、佳博wifi打印机怎么配置
  6. FSM(状态机)、HFSM(分层状态机)、BT(行为树)
  7. 信号隔离器在供热控制系统中的应用
  8. 机器学习-Whitening(白化)
  9. Web网站和Web应用程序的区别
  10. 吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...