最短路径BellmanFord , Dijsktra
最短路径算法也是常用的图算法,在网上看到了一份c的代码,写的很清楚,今天有空给写成java的了,就当练手了。另,算法导论362页详细介绍了Bellman-Ford算法,本来打算再写个Dijsktra算法的,可是今天比较赖,就写这一个算法吧。
- package path;
- import java.util.HashSet;
- public class BellmanFord {
- private int MAX = Integer.MAX_VALUE;
- private int N = 1024;
- //顶点数 , 边数 , 起点
- private int nodenum, edgenum, original;
- //图的边
- private Edge [] edge = new Edge[N];
- //保存距离
- private double [] dis = new double[N];
- private int [] pre = new int[N];
- /**
- * @function
- * @return
- */
- boolean calculate()
- {
- for(int i = 1; i <= nodenum; ++i) //初始化
- dis[i] = (i == original ? 0 : MAX);
- for(int i = 1; i <= nodenum - 1; ++i)
- for(int j = 1; j <= edgenum; ++j)
- //松弛
- if(dis[edge[j].v] > dis[edge[j].u] + edge[j].cost){
- dis[edge[j].v] = dis[edge[j].u] + edge[j].cost;
- pre[edge[j].v] = edge[j].u;
- }
- boolean flag = true;
- //判断是否含有负权回路
- for(int i = 1; i <= edgenum; ++i)
- if(dis[edge[i].v] > dis[edge[i].u] + edge[i].cost){
- flag = false;
- break;
- }
- return flag;
- }
- void print_path(int root) //打印最短路的路径(反向)
- {
- while(root != pre[root]){ //前驱
- System.out.print(root + "-->");
- root = pre[root];
- }
- if(root == pre[root])
- System.out.print(root + "\n");
- }
- public boolean init(Edge [] edges){
- try{
- nodenum = edgenum = 0;
- HashSet<Integer> vSet = new HashSet<Integer>();
- for(int i = 1 ; i < edges.length ; ++i){
- edgenum++;
- edge[i] = edges[i];
- vSet.add(edges[i].u);
- vSet.add(edges[i].v);
- }
- nodenum = vSet.size();
- return true;
- }catch(Exception e){
- e.printStackTrace();
- return false;
- }
- }
- private void calcShortestPath(int original){
- this.original = original;
- pre[original] = original;
- if(calculate())
- for(int i = 1; i <= nodenum; ++i){ //每个点最短路
- System.out.print(dis[i] + "\n");
- System.out.print("Path:");
- print_path(i);
- }
- else
- System.out.println("have negative circle\n");
- }
- public static void main(String [] args)
- {
- BellmanFord bellman = new BellmanFord();
- Edge [] edges = new Edge [7];
- edges[1] = new Edge(1 , 2 , 2);
- edges[2] = new Edge(1 , 3 , 5);
- edges[3] = new Edge(4 , 1 , 10);
- edges[4] = new Edge(2 , 4 , 4);
- edges[5] = new Edge(4 , 2 , 4);
- edges[6] = new Edge(3 , 4 , 2);
- bellman.init(edges);
- bellman.calcShortestPath(1);
- }
- }
- class Edge //边
- { // u为边的前驱结点,v为后继结点(暂且用前驱、后继来说)
- int u, v;
- //边的权重
- double cost;
- public Edge(int u , int v , double cost){
- this.u = u;
- this.v = v;
- this.cost = cost;
- }
- }
最短路径BellmanFord , Dijsktra的更多相关文章
- 最短路径——Bellman-Ford算法以及SPFA算法
说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...
- 单源最短路径—Bellman-Ford和Dijkstra算法
Bellman-Ford算法:通过对边进行松弛操作来渐近地降低从源结点s到每个结点v的最短路径的估计值v.d,直到该估计值与实际的最短路径权重相同时为止.该算法主要是基于下面的定理: 设G=(V,E) ...
- 最短路径——Bellman-Ford算法
一.相关定义 最短路径:求源点到某特定点的最短距离 特点:Bellman-Ford算法主要是针对有负权值的图,来判断该图中是否有负权回路或者存在最短路径的点 局限性:算法效率不高,不如SPFA算法 时 ...
- 求最短路径(Bellman-Ford算法与Dijkstra算法)
前言 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的算法来求 ...
- 单源最短路径---Bellman-Ford算法
传送门: Dijkstra Bellman-Ford SPFA Floyd 1.Dijkstra算法的局限性 像上图,如果用dijkstra算法的话就会出错,因为如果从1开始,第一步dist[2] = ...
- matlab练习程序(单源最短路径Bellman-Ford)
该算法可以用来解决一般(边的权值为负)的单源最短路径问题,而dijkstra只能解决权值非负的情况. 此算法使用松弛技术,对每一个顶点,逐步减少源到该顶点的路径的估计值,直到达到最短的路径. 算法运算 ...
- 最短路径 bellman-ford
初始化:将除源点外的所有顶点的最短距离估计值 d[v] ←+∞, d[s] ←0 迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离:(运行|v ...
- 最短路径之Dijsktra算法(python)
定义: 起始位置:A 终止位置:F 持久集合:permanent = set() 暂时集合:temporary = set() 首先将起始位置A加入永久集合,并将A的距离设为0, 此时遍历A的邻接节点 ...
- 四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)
什么是最短路径问题? 简单来讲,就是用于计算一个节点到其他所有节点的最短路径. 单源最短路算法:已知起点,求到达其他点的最短路径. 常用算法:Dijkstra算法.Bellman-ford算法.SPF ...
随机推荐
- 1、android orm之greendao
前提:最近写android项目,android自带数据库api有点复杂,于是偷懒用了greendao.greendao好处自己查,这里不赘述,但是零基础的的我用起来还是费了3天的功夫,取之于网络,特在 ...
- word检视意见导出(VBA)
Private Sub CommandButton1_Click() 'Dim Cmt As Comment Dim excelApp As Object Dim xlsWbk, objWdApp A ...
- Java 7 中 NIO.2 的使用——第二节 元数据文件的属性
如果你有很多疑问关于一个文件或目录,它是否是隐藏的,它的大小是多少,谁拥有它,你可以从元数据中得到这些信息.所谓的元数据,就是描述数据的数据. NIO.2组织了这些原数据的属性的概念,并提供了java ...
- PHP去除数组中重复数据的两个例子
例一: <?php$input = array("a" => "green","", "red"," ...
- HDU 5446 Unknown Treasure Lucas+中国剩余定理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5446 Unknown Treasure 问题描述 On the way to the next se ...
- WebServices中Xml的序列化
一.定义序列化实体类 [System.Xml.Serialization.XmlRoot("Custome_Xml_Root_Name")] //自定义生成的Xml根目录名称 pu ...
- Linq中Select查询参数提取公共方法
class Program { static void Main(string[] args) { var listTest1 = new List<Test1> { "}, & ...
- 【python】编码规范(转载)
转自:http://www.cnblogs.com/itech/archive/2012/01/06/2314454.html 1 编码 >>所有的 Python 脚本文件都应在文件头标上 ...
- 推荐系统之LFM(二)
对于一个用户来说,他们可能有不同的兴趣.就以作者举的豆瓣书单的例子来说,用户A会关注数学,历史,计算机方面的书,用户B喜欢机器学习,编程语言,离散数学方面的书, 用户C喜欢大师Knuth, Jiawe ...
- NYOJ-655 光棍的YY AC 分类: NYOJ 2013-12-29 19:24 224人阅读 评论(0) 收藏
#include<stdio.h> #include<string.h> char str[210]; int max[210][52]={0}; int sum(int n, ...