按路径长度递增次序产生算法:
把顶点集合V分成两组:
  (1)S:已求出的顶点的集合(初始时只含有源点V0)
  (2)V-S=T:尚未确定的顶点集合
将T中顶点按递增的次序加入到S中,保证:
  (1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度
  (2)每个顶点对应一个距离值
  S中顶点:从V0到此顶点的长度
  T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度
  依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和
  (反证法可证)
求最短路径步骤
  算法步骤如下:
  G={V,E}
  1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值
    若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
    若不存在<V0,Vi>,d(V0,Vi)为∞
  2. 从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中
  3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
  重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止
/**
* @moudle: DijkstraTest
* @version:v1.0
* @Description: TODO
* @author: HeroZearin
* @date: 2016年8月19日 下午2:56:27
*
*/
public class DijkstraTest { /**
*
* <p>Title: main</p>
* <p>author : HeroZearin</p>
* <p>date : 2016年8月19日 下午2:56:27</p>
* @param args
*/
public static void main(String[] args) {
int n = 6;
int max = Integer.MAX_VALUE;
//初始化路径,都为最大值。
int path[][]={
{ 0, 3, 2, 1, max, max},
{ 3, 0, max, max, 3, max},
{ 2, max, 0, max, 3, 2},
{ 1, max, max, 0, 3, max},
{max, 3, 3, 3, 0, 4},
{max, max, 2, max, 4, 0},
};
System.out.println("邻接矩阵详情");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(String.format("%010d", path[i][j]) + ", ");
}
System.out.print("\r\n");
} //这里需要输入path[i][j]的具体内容,如果有重复数据的话,需要更新路径为最小值。
int minLen[]=new int[n];
//visit初始为0,表示处于集合T中
//求得距离定点S0最短距离后则加入到集合S中,visit设置为1
//此过程不可逆,当所有顶点都加入到集合S中时,算法结束。
int visit[]=new int[n];
//初始化1到其他点的距离。
for(int i=0;i<n;i++){
minLen[i]=path[0][i];
}
// void Dijkstra(){
minLen[0]=0;
visit[0]=1;
int minj=1;
for(int i=0;i<n;i++){
int min=Integer.MAX_VALUE;
for(int j=0;j<n;j++){
if(visit[j]==0&&minLen[j]<min){
min=minLen[j];
minj=j;
}
}
visit[minj]=1;
for(int j=0;j<n;j++){
if(visit[j]==0&&minLen[minj]!=Integer.MAX_VALUE&&path[minj][j]!=
Integer.MAX_VALUE&&minLen[j]>(minLen[minj]+path[minj][j])){
minLen[j]=minLen[minj]+path[minj][j];
}
}
}
// }
System.out.println("-------------------------------------------");
for(int idx = 0 ; idx < n ; idx ++ ){
System.err.println("minLen[" + idx + "] is " + minLen[idx] );
}
} }

  

Dijkstra算法亲自实践的更多相关文章

  1. (转)最短路径算法-Dijkstra算法分析及实践

    原地址:http://www.wutianqi.com/?p=1890 这篇博客写的非常简洁易懂,其中各个函数的定义也很清晰,配合图表很容易理解这里只选取了 其中一部分(插不来图片). Dijkstr ...

  2. Dijkstra算法and Floyd算法 HDU 1874 畅通工程续

    Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把 ...

  3. Cocos2d-x 地图步行实现1:图论Dijkstra算法

    下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...

  4. AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题

    在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...

  5. Dijkstra 算法——计算有权最短路径(边有权值)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 Dijkstra 的思想并用源代码加以实现: 0.2)最短路径算法的基础知识,参见 http://blog. ...

  6. Dijkstra算法与堆(C++)

    Dijkstra算法用于解决单源最短路径问题,通过逐个收录顶点来确保得到以收录顶点的路径长度为最短.      图片来自陈越姥姥的数据结构课程:https://mooc.study.163.com/l ...

  7. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  8. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  9. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

随机推荐

  1. linux下proc目录详解

    proc/pid记录了什么cd /proc/之后,你会发现很多的目录和文件,今天首先来介绍的就是那些以数字命名的目录--它们就是linux中的进程号,每当你创建一个进程时,里面就会动态更新多出一个名称 ...

  2. mysql实体关系(mysql学习五)

    实体关系  表设计 1:1 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为一一对应 优化上称为垂直分割 1:n 一个实体对应多个其他实体(一个班级 ...

  3. js闭包理解实例小结

    Js闭包 闭包前要了解的知识  1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...

  4. 代码分享:php对二维数组进行排序

    发布:net/PHP编程  编辑:thebaby   2013-06-28 13:12:54  [大 中 小] 转自:http://www.jbxue.com/article/9991.html本文介 ...

  5. PowerShell 方式部署Sharepoint Solution

    覆盖 Uninstall-SPSolution –Identity Caesarstone.GlobalSite.WebSite.wsp –WebApplication http://myserver ...

  6. ASP.NET MVC5学习笔记之Controller执行ControllerDescriptor和ActionDescriptor

    一. ControllerDescriptor说明 ControllerDescriptor是一个抽象类,它定义的接口代码如下: public abstract class ControllerDes ...

  7. xtrabackup之Innobackupex全备数据库

    一.Xtrabackup是什么: Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品. ...

  8. [terry笔记]RMAN综合学习之配置

    [terry笔记]RMAN综合学习之备份http://www.cnblogs.com/kkterry/p/3308405.html [terry笔记]RMAN综合学习之恢复 http://www.cn ...

  9. Moses创建一个翻译系统的基本过程记录,以后会按照每个过程详细说明,并给出每个步骤的参数说明

    软件需求: 首先你必须要有Moses(废话哈哈).然后要有GIZA++用作词对齐(traning-model.perl的时候会用到).IRSTLM产生语言模型 大致步骤: 大体的步骤如下: 准备Par ...

  10. Android UmengShareSDK第三方登录

    Android UmengShareSDK 第三方登录- 今天就不废话了,集成平台第三方登录.市面上集成平台有shareSDK 和 Ument两种,shareSDK的ipa和服务好些,如果自己研究会很 ...