本文采用java实现单源最短路径,并带有略微详细的注解,供大家参考,具体内容如下

package com.qf.greaph;

import java.util.arraylist;

import java.util.arrays;

import java.util.hashmap;

import java.util.map;

import java.util.map.entry;

/**

* @author jiayoo

* 7 / 30

* dijkstra最短路径算法是一种单源最短路径

* 本文采用的是邻接表表示图。

*

* 图的表示: 1. 采用 arraylist 来储存 图的顶点

* 2. 采用 map 来储存 边集 , map 可以 实现 一对多的关系, 因此能很好的实现邻接表结构

* 3. 采用arraylist的原因 是使 边集有序 这样, node 的里面 那个记录距离的集合才能一一对应

*/

public class minpath {

private static class graph{

private arraylist nodes = new arraylist<>(); // 表示图顶点 , 同时他也作为v集合

private map> adjanode = new hashmap<>(); // 表示图的边

private arraylist nodes1 ; // 表示s集合, 即存储已经访问的节点,

private float[] minpath; //用来存储源点到每个顶点的距离

float min = float.max_value;

/**

* @param start

* @param end

* @param distance

* 构建邻接表。使之成为图

*/

public void addadjanode(node1 start, node1 end, float distance) {

if (!nodes.contains(start)) {

nodes.add(start);

}

if (!nodes.contains(end)) {

nodes.add(end);

}

if (adjanode.containskey(start) && adjanode.get(start).contains(end)) {

return ;

}

if (adjanode.containskey(start)) {

adjanode.get(start).add(end);

}else {

arraylist node = new arraylist();

node.add(end);

adjanode.put(start, node);

}

start.distonext.add(distance);

}

/**

* 将图打印出来

*/

public void pringraph() {

if (nodes == null || adjanode == null) {

system.out.println("图为空");

return ;

}

for (entry> entry : adjanode.entryset()) {

system.out.println("顶点 : " + entry.getkey().name + " 链接顶点有: ");

for(int i = 0; i < entry.getvalue().size(); i++) {

system.out.print(entry.getvalue().get(i).name + " " + "距离是: " + entry.getkey().distonext.get(i) + ", ");

}

system.out.println();

}

}

/**

* 1.这个方法用于初始化s集合 及 初始化距离数组

* 2. 设置源点, 并且将源点作为内容 初始化算法

*/

public void findminpath() {

node1 node1 = null; // 用来记录列表里最小的点

nodes1 = new arraylist<>(); // 存储已经遍历过的点

minpath = new float[nodes.size()]; // 初始化距离数组

int i;

/*

* 对最短路径进行初始化, 设置源点到其他地方的值为无穷大

* */

for (i = 0; i < minpath.length; i++) {

minpath[i] = float.max_value;

}

node1 node = nodes.get(0);

nodes1.add(node); // 将源点加入 s 集合

node.visited = true;

arraylist n = adjanode.get(node); // 获取到源点的边集

/*

* 先对源节点进行初始化

* 1. 对 距离数组进行初始化。

* 2. 找到源点到某个距离最短的点, 并标记

*

* */

for (i = 0; i < n.size(); i++) {

minpath[n.get(i).id] = node.distonext.get(i); // 最短路径记录

if (min > node.distonext.get(i)) {

min = node.distonext.get(i);

node1 = n.get(i); // 找到当前最短路径

}

}

this.process(node1, min);

}

private void process(node1 node, float distance ) {

min = float.max_value; //作为标记

node1 node1 = null; // 同样记录距离最短的点

int i;

arraylist n = adjanode.get(node); // 获得边集

for (i = 0 ; i < n.size(); i++) {

if (!n.get(i).visited) { // 这个边集里的顶点不在 s 集合里

if (minpath[n.get(i).id] == float.max_value) {

minpath[n.get(i).id] = distance + node.distonext.get(i); // 源点到下一点的距离

}else if (distance + node.distonext.get(i) < minpath[n.get(i).id] ) { //源点到该顶点的距离变小了, 则改变

minpath[n.get(i).id] = distance + node.distonext.get(i); // 更新源点到下一个点的距离

}

}

}

/*

* 这个for 用于找到 距离集合中 距离源点最近 且并未被访问过的

* 这个for 同时可以确保 该节点确实可到达

* */

for (i = 1; i < minpath.length; i++) {

if (!nodes.get(i).visited) {

if (min > minpath[i] ) {

min = minpath[i];

node1 = nodes.get(i);

}

}

}

if (node1 != null) {

node1.visited = true;

process(node1, min); //源点到 当前的距离

}else { // 说明此位置没有后续节点, 或者 已经全部被访问完了, 则到达此位置只需要加上此位置的值

}

}

}

public static void main(string[] args) {

node1 n1 = new node1(0,"a");

node1 n2 = new node1(1,"b");

node1 n3 = new node1(2,"c");

node1 n4 = new node1(3,"d");

node1 n5 = new node1(4,"e");

node1 n6 = new node1(5,"f");

graph gp = new graph();

gp.addadjanode(n1, n2, 6);

gp.addadjanode(n2, n1, 6);

gp.addadjanode(n1, n3, 3);

gp.addadjanode(n3, n1, 3);

gp.addadjanode(n2, n3, 2);

gp.addadjanode(n3, n2, 2);

gp.addadjanode(n2, n4, 5);

gp.addadjanode(n4, n2, 5);

gp.addadjanode(n3, n4, 3);

gp.addadjanode(n4, n3, 3);

gp.addadjanode(n3, n5, 4);

gp.addadjanode(n5, n3, 4);

gp.addadjanode(n4, n5, 2);

gp.addadjanode(n5, n4, 2);

gp.addadjanode(n4, n6, 3);

gp.addadjanode(n6, n4, 3);

gp.addadjanode(n5, n6, 5);

gp.addadjanode(n6, n5, 5);

// 下面尝试一下非连通图

// /**

// * 权值: 1

// * a -----------b

// * 权 | *

// * 值 | * 权值: 3

// * 2 | *

// * c-----d

// * 权值: 5

// *

// *

// * */

//

// gp.addadjanode(n1, n2, 1);

// gp.addadjanode(n2, n1, 1);

//

// gp.addadjanode(n1, n3, 2);

// gp.addadjanode(n3, n1, 2);

//

// gp.addadjanode(n1, n4, 3);

// gp.addadjanode(n4, n1, 3);

//

// gp.addadjanode(n3, n4, 5);

// gp.addadjanode(n4, n3, 5);

gp.pringraph();

system.out.println("--------------------------------------------------------------------");

system.out.println("此数组下标代表id,值代表从源点分别到各点的最短距离, a开始的下标是0, b、c、d等依次类推, 并且源点默认设置为id为零0的开始");

gp.findminpath();

system.out.println(arrays.tostring(gp.minpath));

}

}

/**

* 顶点类

*/

class node1{

string name;

boolean visited = false; // 访问状态。有效 减少原算法移除v集合中元素所花费的时间

int id = -1; // 设置默认id为-1

arraylist distonext = new arraylist<>(); //这一点 到另外每一个点的距离

public node1(int id, string name) {

this.id = id;

this.name = name;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

希望与广大网友互动??

点此进行留言吧!

单源路径分支界限java_java实现单源最短路径相关推荐

  1. 单源路径分支界限java_java单源最短路径算法

    . .. .. . 单源最短路径的 Dijkstra 算法: 问题描述: 给定一... 并 应用贪心法求解单源最短路径问题.环境要求对于环境没有特别要求.对于算法实现,可以自由选择 C, C++, J ...

  2. 单源路径分支界限java_分支限界法—单源最短路径问题

    转自:http://www.cnblogs.com/chinazhangjie/archive/2010/11/01/1866136.html 分支限界法与回溯法 (1)求解目标:回溯法的求解目标是找 ...

  3. 单源路径分支界限java_单源最短路径-分支界限法

    单源最短路径-分支界限法-优先队列式.这里使用无回路的有向图,便于构建树.构建好树后,从根结点作为起始源,加入结点队列,然后判断获取队列中最短的路径结点做为活结点,将活结点的所有子结点加入队列,移除活 ...

  4. 单链表的逆序java_java 实现单链表的逆序

    package com.ckw.mianshi; /** * java 实现单链表的逆序 * @author Administrator * */ public class SingleLinkedR ...

  5. 图论——单源路径问题

    文章目录 图论--单源路径问题 问题分析 代码 指定终点代码 图论--单源路径问题 问题分析 对于本小节,我们只讨论简单无向无权图的单源路径问题. 单源路径是指从某个给定顶点出发找到一条路径到其他顶点 ...

  6. 云客Drupal源码分析之实体表单显示EntityFormDisplay

    以下内容仅是一个预览,完整内容请见文尾: 实体的显示分为表单显示和视图显示,前者用于不同情况下的信息输入,后者用于不同情况下的信息展示,本篇很多内容不止用于本篇所讲的表单主题,也是学习drupal视图 ...

  7. 麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式

    做价值的传播者,一路同行,一起成长 问题:怎样才能每天都收到这类文章! 答案:只需点击上方<通达信公式指标> {通达信单阳不破}MA30: MA(C,30 ),COLORGREEN;MA3 ...

  8. java表单单击路径_Form表单中的action路径问题,form表单action路径《jsp---Servlet路劲问题》这个和上一个《jsp---Servlet》文章有关...

    Form表单中的action路径问题,form表单action路径 今天刚接触web,在用jsp和servlet做一个简单的登陆的时候在Form表单action属性和method属性的一些问题: 我遇 ...

  9. 单、多分支结构的应用(有点复杂)

    文章目录 一.演示单分支的过滤作用 单分支结构一般用于把关或过滤.当然,大家可以用双分支结构来处理这个问题.代码如下:![在这里插入图片描述](https://img-blog.csdnimg.cn/ ...

最新文章

  1. DOS命令行操作MySQL常用命令
  2. 更换yum的源为阿里云或者网易
  3. Android onMeasure方法介绍
  4. FIFO and DMA
  5. 关于思考写程序的意义
  6. 32-bit到64-bit 开发及升级经验
  7. Java 字符串 String 与整数型 int 之间的转换
  8. Java方法中的参数太多,第5部分:方法命名
  9. 程序员一人对接四人郁闷吐槽:轮流指挥,只有我从天亮忙到天黑
  10. [九度][何海涛] 变态跳台阶
  11. 数据挖掘:模型选择——KNN
  12. windows命令 笔记
  13. ElasticSearch完结篇------京东搜索实战
  14. c语言一个偶数用两个素数表示,用C语言(C99) 验证哥德巴赫猜想:一个不小于6的偶数必定能表示为两个素数之和。...
  15. 截取网页中的Flash
  16. 《C专家编程》阅读笔记
  17. iec611313标准下载_IEC 62108-2016
  18. BFS算法(广度优先搜索)java
  19. D - Plane 航空管制2 HYSBZ - 2535
  20. pdf转换成jpg转换器的使用方法

热门文章

  1. <<R语言入门与实践>>读书笔记
  2. 嗖嗖嗖主题网Wordpress主题视频制作教程--第五讲 Wordpress公共区域header.php和footer.php的拆分和制作
  3. 光热VS光伏,发电效率哪家强?
  4. 在内核目录中编译驱动与Kconfig
  5. PS大神的作品,每张都是科幻大片!
  6. java计算机毕业设计红河旅游信息服务系统源程序+mysql+系统+lw文档+远程调试
  7. 082-天气预报之城市代码 ID
  8. Vegas为什么能够那么秀?
  9. ETC电子不停车收费系统(附项目总文件下载)
  10. Win10扬声器没有增强选项怎么办?