最短路径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 ...
随机推荐
- 我给女朋友讲编程html系列(2) --Html标题标签h1
Html是一门标签语言,因此学习Html最快的方式就是学习使用html标签. html标题标签:h1,h2,h3,h4,h5,h6 标题标签总共有6个,h1,h2,h3,h4,h5,h6,从h1到h6 ...
- ngcordova 监控网络制式改变
ngcordova 监控网络制式改变 keywords cordova,phonegap,ionic,network,网络制式 API参考 http://ngcordova.com/docs/plug ...
- bzoj 3293 数学整理
和1045一模一样,找到这道题的时候还愣了下神,最后发现样例都是 一样的,直接粘了1045的代码,具体题解看 http://www.cnblogs.com/BLADEVIL/p/3468729.htm ...
- EditPlus配置[C++] [Python] [Java] 编译运行环境
以前一直用Codeblocks写C++,eclipse写Java,再在eclipse里面集成PyDev写Python,首先无法忍受代码自动补全功能(这个功能也许你万分喜欢),也无法忍受如此重量级的ID ...
- hdu 1853 Cyclic Tour 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...
- shiro中unauthorizedUrl不起作用
解决方法: 在shiro配置文件中添加(异常全路径做key,错误页面做value) <bean class="org.springframework.web.servlet.handl ...
- 响应式嵌入 iframe Pym.js
Pym.js 可以让你在嵌入 iframe 的时候可自动的对 iframe 的大小进行调整以适应父一层容器,并且可以避免跨域问题. 支持浏览器: Internet Explorer 9, 10 (Wi ...
- p3p之讲解
P3P是一种被称为个人隐私安全平台项目(the Platform for Privacy Preferences)的标准,能够保护在线隐私权,使Internet冲浪者可以选择在浏览网页时,是否被第三方 ...
- Sqlite中使用rowid来表示行号,用于分页。
在SQLite的查询结果中显示行号,可以使用select rowid as RowNumber ,* from WSCLanguage: select rowid as RowNumber ,* fr ...
- ios 7 20像素解决
1.if ([[[UIDevicecurrentDevice] systemVersion] floatValue] >= 7) { self.view.bounds = CGRectMake( ...