import java.util.ArrayList;

import java.util.Scanner;

/**
* 贝尔曼-福特算法
*
* Bellman - ford算法是求含负权图的单源最短路径算法,效率较低。
* @author CEMABENTENG
*
*/
public class BellmanFord
{
  private static int n, m;

  private static final int MAXN = 100;

  private static final int INF = Integer.MAX_VALUE;

  private static ArrayList<Edge> edges = new ArrayList<Edge>();

  private static int[][] edge = new int[MAXN][MAXN];

  private static int[] dist = new int[MAXN];

  private static int[] path = new int[MAXN];

  public static void main(String[] args)
  {
    Scanner scan = new Scanner(System.in);
    while (scan.hasNext())
    {
      //点
      n = scan.nextInt();
      //边
      m = scan.nextInt();

      //初始化点
      for (int i = 0; i < n; i++)
      {
        for (int j = 0; j < n; j++)
        {
          if (i == j)
          {
            edge[i][j] = 0;
          }
          else
          {
            edge[i][j] = INF;
          }
        }
      }
      //初始化边
      for (int i = 0; i < m; i++)
      {
        //边左点
        int u = scan.nextInt();
        //边右点
        int v = scan.nextInt();
        //权
        int w = scan.nextInt();
        Edge edge_ = new BellmanFord.Edge();
        edge_.u = u;
        edge_.v = v;
        edge_.w = w;
        edge[u][v] = w;
        edges.add(edge_);
      }
      //查找0的距离
      bellman(1);
      for (int i = 0; i < n; i++)
      {
        System.out.println("从0到" + i + "的距离最短为 :" + dist[i]);
      }
    }
  }

  /**
  * 贝尔曼-福特算法
  * @param vo
  */
  public static void bellman(int vo)
  {
    int i, k;
    for (i = 0; i < n; i++)
    {
      //初始化所有最短距离
      dist[i] = INF;
      path[i] = -1;
    }
    //结果集的起点,起点距离为0
    dist[vo] = 0;
    //遍历点
    for (k = 1; k < n; k++)
    {
      //遍历边
      for (i = 0; i < m; i++)
      {
        Edge edge = edges.get(i);

/**
* 当前边的左点到原点距离有值,且边的左点到原点的值+当前权小于右点到原点的值,则更新右点到原点的值(即松弛算法)
*
* 每个单源最短路径算法中都会初始化,然后重复对边进行松弛的过程。
* 另外,松弛是改变最短路径和前趋的唯一方式。各个单源最短路径算法间区别在于对每条边进行松弛操作的次数,以及对边执行松弛操作的次序有所不同。在
*/
        if (dist[edge.u] != INF && dist[edge.u] + edge.w < dist[edge.v])
        {
          dist[edge.v] = dist[edge.u] + edge.w;
          path[edge.v] = edge.u;
        }
      }
    }
  }

  public static class Edge
  {
    int u, v, w;
  }

}

BellmanFord贝尔曼-福特算法的更多相关文章

  1. Bellman-Bord(贝尔曼-福特)

    include const int inf=0x3f3f3f3f; int main() { int m,n; scanf("%d%d",&n,&m); int u ...

  2. oj2894(贝尔曼福特模板)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2894 就因为粗心,一中午没A,题目说是2000 ...

  3. Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法

    1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...

  4. Bellman-Ford 单源最短路径算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...

  5. 单源最短路径算法——Bellman-ford算法和Dijkstra算法

     BellMan-ford算法描述 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V ...

  6. 【算法】单元最短路径之Bellman-Ford算法和SPFA算法

    SPFA是经过对列优化的bellman-Ford算法,因此,在学习SPFA算法之前,先学习下bellman-Ford算法. bellman-Ford算法是一种通过松弛操作计算最短路的算法. 适用条件 ...

  7. Bellman-Ford(BF)和Floyd算法

    以下只是本人的笔记,想法我自己都怀疑,内容不作为参考, Floyd算法就比较暴力了,算法思想是三重循环,直接枚举所有的顶点,再两次for循环枚举所有点,验证以第一个点为中转点的两个点是否路径更短,具体 ...

  8. 最短路--Bellman-Ford

    Bellman-Ford 贝尔曼-福特 算法思想 贝尔曼-福特算法(英语:Bellman–Ford algorithm),求解单源最短路径问题的一种算法,由理查德·贝尔曼 和 莱斯特·福特 创立的.它 ...

  9. 最短路算法 (bellman-Ford算法)

    贝尔曼-福特算法与迪科斯彻算法类似,都以松弛操作为基础,即估计的最短路径值渐渐地被更加准确的值替代,直至得到最优解.在两个算法中,计算时每个边之间的估计距离值都比真实值大,并且被新找到路径的最小长度替 ...

随机推荐

  1. Web测试实践--Rec 2

    累计完成任务情况: 阶段内容 参与人 进行用户调研 小熊 开会学习作业要求,取得共识 全体 注: 1."阶段内容"划斜线表示完成.2.采用倒序. 具体情况: 小熊主要围绕以下几方面 ...

  2. 用nodejs搭建最简单、轻量化的http server(转)

    出处:http://www.cnblogs.com/wangfupeng1988/p/4143996.html 1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后 ...

  3. java/rabbitmp发布订阅示例(转)

    原文:http://www.cnblogs.com/tinmh/p/6134875.html 发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exc ...

  4. python 函数星号参数说明

    转自: python 函数参数的传递(参数带星号的说明) python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何 ...

  5. hadoop大致问题

    一.项目编码实现 HDFS文件上传 HDFS文件下载 定位文件读取 通过API操作HDFS 通过IO流操作HDFS HDFS写数据流程 HDFS读数据流程 统计一堆文件中单词出现的个数(WordCou ...

  6. sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别(转)

    sqlite数据库存储table1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不 ...

  7. mysql数据库使用sql查询数据库大小及表大小

    网上查了很多资料,最后发现一个可行的,分享如下: 数据库大小查询: select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from inform ...

  8. 【架构】基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...

  9. hadoop1.2.1+hbase0.94.11+nutch2.2.1+elasticsearch0.90.5安装配置攻略

    一.背景 最近由于项目和论文的需要,需要搭建一个垂直搜索的环境,查阅了很多资料,决定使用Apache的一套解决方案hadoop+hbase+nutch+es.这几样神器的作用就不多作介绍了,自行参考各 ...

  10. MVC MVC常见错误及解决办法

    MVC常见错误及解决办法 问题1: 必须添加对程序集“EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5 ...