java迪杰斯特拉算法_迪杰斯特拉算法完整代码(Java)

package com.rao.graph;

import java.util.*;

/**

* @author Srao

* @className Dijkstra

* @date 2019/12/10 22:15

* @package com.rao.graph

* @Description 迪杰斯特拉算法

*/

public class Dijkstra {

/**

* 图的顶点

*/

private static class Vertex{

String data;

Vertex(String data){

this.data = data;

}

}

/**

* 图的边

*/

private static class Edge{

//从adj[i]到index

int index;

//到index的距离

int weight;

public Edge(int index, int weight) {

this.index = index;

this.weight = weight;

}

}

/**

* 图(邻接矩阵)

*/

private static class Graph{

private Vertex[] vertices;

private LinkedList[] adj;

Graph(int size){

vertices = new Vertex[size];

adj = new LinkedList[size];

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

adj[i] = new LinkedList<>();

}

}

}

/**

* 初始化图

* @param graph

*/

private static void initGraph(Graph graph){

graph.vertices[0] = new Vertex("A");

graph.vertices[1] = new Vertex("B");

graph.vertices[2] = new Vertex("C");

graph.vertices[3] = new Vertex("D");

graph.vertices[4] = new Vertex("E");

graph.vertices[5] = new Vertex("F");

graph.vertices[6] = new Vertex("G");

graph.adj[0].add(new Edge(1, 5));

graph.adj[0].add(new Edge(2, 2));

graph.adj[1].add(new Edge(0, 5));

graph.adj[1].add(new Edge(3, 1));

graph.adj[1].add(new Edge(4, 6));

graph.adj[2].add(new Edge(0, 2));

graph.adj[2].add(new Edge(3, 6));

graph.adj[2].add(new Edge(5, 8));

graph.adj[3].add(new Edge(1, 1));

graph.adj[3].add(new Edge(2, 6));

graph.adj[3].add(new Edge(4, 1));

graph.adj[3].add(new Edge(5, 2));

graph.adj[4].add(new Edge(1, 6));

graph.adj[4].add(new Edge(3, 1));

graph.adj[4].add(new Edge(6, 7));

graph.adj[5].add(new Edge(2, 8));

graph.adj[5].add(new Edge(3, 2));

graph.adj[5].add(new Edge(6, 3));

graph.adj[6].add(new Edge(4, 7));

graph.adj[6].add(new Edge(5, 3));

}

/**

* 迪杰斯特拉算法

* @param graph:图

* @param startIndex:图的起点

* @return

*/

public static Map dijkstra(Graph graph, int startIndex){

//创建距离表,存放起点到每一个点的距离,默认值为无穷大

Map distanceMap = new HashMap<>();

//记录已经遍历过的顶点

Set accessedSet = new HashSet<>();

//图的顶点数量

int size = graph.vertices.length;

//初始化距离表

for (int i = 1; i < size; i++) {

distanceMap.put(i, Integer.MAX_VALUE);

}

//遍历起点,刷新距离表

accessedSet.add(0);

List edgesFromStart = graph.adj[startIndex];

for (Edge edge : edgesFromStart) {

distanceMap.put(edge.index, edge.weight);

}

//循环遍历所有的点,并且刷新距离表

for (int i = 1; i < size; i++) {

//寻找到顶点最短的距离的点

int minDistanceFromStart = Integer.MAX_VALUE;

int minDistanceIndex = -1;

for (int j = 1; j < size; j++) {

if (!accessedSet.contains(j) && distanceMap.get(j) < minDistanceFromStart){

minDistanceFromStart = distanceMap.get(j);

minDistanceIndex = j;

}

}

if (minDistanceIndex == -1){

break;

}

//遍历这个最小距离的顶点

accessedSet.add(minDistanceIndex);

for (Edge edge : graph.adj[minDistanceIndex]) {

if (accessedSet.contains(edge.index)){

continue;

}

int weight = edge.weight;

int preDistance = distanceMap.get(edge.index);

if (weight != Integer.MAX_VALUE && (minDistanceFromStart + weight) < preDistance){

distanceMap.put(edge.index, minDistanceFromStart + weight);

}

}

}

return distanceMap;

}

public static void main(String[] args) {

Graph graph = new Graph(7);

initGraph(graph);

Map distanceMap = dijkstra(graph, 0);

int distance = distanceMap.get(6);

System.out.println(distance);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 布局学习之——Layout(布局)详解一

layout&#xff08;布局&#xff09;定义了用户界面的可视化结构&#xff08;visual structure&#xff09;,如Activity的UI,应用窗口的UI。 有两种方式声明layout: 1.在xml文件中声明UI组件。 2.在运行时&#xff0c;实例化布局元素。我们可以以编码的方式创建View或ViewGroup…

查询表结构

方法一SELECT 序号C.column_id, 列名C.name, 是否主键ISNULL(IDX.PrimaryKey,N), 数据类型T.name, 长度C.max_length, PrecisionC.precision, 小数位C.scale, 允许空CASE WHEN C.is_nullable1 THEN N是ELSE N否 END, 默认值ISNULL(D.definition,N),…

java window linux_java编程在linux下和windows下有什么区别。。。

在windows系统下编程没有点问题&#xff0c;一旦放在linux上就出现以下错误Strutshasdetectedanunhandledexception:Messages:...在windows系统下编程没有点问题&#xff0c;一旦放在linux上就出现以下错误 Struts has detected an unhandled exception: Messages: There is no…

SendMessage函数的常用消息及其应用大全

来源&#xff1a;http://www.360doc.com/content/09/0814/10/19147_4907488.shtml&#xff0c;非常全面的解释。 文本框控件通常用于输入和编辑文字。它属于标准 Windows 编辑控件的一个子类,所以它支持所有编辑控件消息。这儿讲述的技术也适用于由其他厂商设计的,以Windows编辑…

初识jQuery(适合初学者哟.........)

您要知道!! jQuery是目前使用最广泛的javascript函数库。据统计&#xff0c;全世界排名前100万的网站&#xff0c;有46%使用jQuery&#xff0c;远远超过其他库。 微软公司甚至把jQuery作为他们的官方库。对于网页开发者来说&#xff0c;学会jQuery是必要的。因为它让你了解业界…

java方法区对象类型_浅谈Java内存区域与对象创建过程

一、java内存区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而存在&#xff0c;有的区域则依赖用户线程的启动和结束而建立和销毁。根…

Week1 Team Homework #2 Introduction of team member with photos

小组成员介绍 组长&#xff1a;黄剑锟 11061164 组员&#xff1a;顾泽鹏 11061160 组员&#xff1a;周辰光 11061154 组员&#xff1a;龚少波 11061167 组员&#xff1a;赵骞 11061155 组员&#xff1a;孙时 11061146 组员&am…

TextView控件

下面我们将比较一下Android中的TextView和C#Winform中TextBox的不同。 当我们要获取一个文本框控件时。 C#:TextBox1                      //直接输入控件的名称即可 Android:TextView tv (TextView) this.findViewById(R.id.tv); // 获取…

[Silverlight入门系列]使用MVVM模式(3):Model的INotifyPropertyChanged接口实现

当客户端绑定一个数据模型以后&#xff0c;数据模型变化以后可以自动通知客户端更新界面显示&#xff0c;这就是INotifyPropertyChanged接口要做的工作。INotifyPropertyChanged 接口用于向客户端&#xff08;通常是执行绑定的客户端&#xff09;发出某一属性值已更改的通知。例…

inttostr java_Delphi和Java实现webservice架构

Webservice现在已经不是什么新技术了&#xff0c;用java建立webservice是快捷的&#xff0c;但是用java在制作客户端的感觉上总是不如 Delphi的(个人感觉&#xff0c;java高手们不要笑话我)&#xff0c;那我们就用java实现webservice的服务端程序&#xff0c;delphi制作客户端。…

XML DOM 节点

来自&#xff1a;w3cschool菜鸟教程 在 DOM 中&#xff0c;XML 文档中的每个成分都是一个节点。 DOM 节点 根据 DOM&#xff0c;XML 文档中的每个成分都是一个节点。 DOM 是这样规定的&#xff1a; 整个文档是一个文档节点每个 XML 元素是一个元素节点包含在 XML 元素中的文本是…

CentOS系列启动流程和内核原理(5系列,6系列,7系列)

前言&#xff0c;本来让我写博客我是拒绝的然而看见大家都在写&#xff0c;还能不能一起友好的玩耍了&#xff1f; 我要是不写怎能和同大神们一起ZB呢&#xff1f;遂开博客&#xff01; 一、Linux启动内核文件 1.Linux系统组成 动态视角&#xff1a;内核根文件系统 静态视…

如何在CentOS 5.5上安装Kippo蜜罐

Kippo是一个可交互的SSH蜜罐&#xff0c;旨在记录暴力攻击行为&#xff0c;最重要的是可以记录攻击者的shell交互行为&#xff0c;如果你需要了解有关Kippo更多信息&#xff0c;请访问它的官方网站http://code.google.com/p/kippo/&#xff0c;本教程只教你如何在CentOS 5.5服务…

LSTM和GRU vs 循环神经网络RNN

1、考虑下列三种情况下&#xff0c;对比一下普通RNN的表现和LSTM和GRU表现&#xff1a; &#xff08;1&#xff09;早期观测值对预测未来观测者具有非常重要的意义。 考虑一个极端情况&#xff0c;其中第一个观测值包含一个校验和&#xff0c; 目标是在序列的末尾辨别校验和是…

uva10617 - Again Palindrome(dp)

再次回文 输入&#xff1a;标准输入 输出&#xff1a;标准输出 时间限制&#xff1a; 2秒 是palindorme的读取相同的从左边&#xff0c;因为它从右侧的一个或多个字符的序列。例如&#xff0c;Ž&#xff0c;TOT和女士的 回文&#xff0c;但是&#xff0c;ADAM是不是。 给定一个…

java ora-12505_Oracle SQL Developer连接报错(ORA-12505)的解决方案(两种)

用oracle数据库新建连接时遇到ora-12505&#xff0c;此问题解决后又出现ora-12519错误&#xff0c;郁闷的半天&#xff0c;经过一番折腾问题解决&#xff0c;下面小编把我的两种解决方案分享给大家&#xff0c;仅供参考。解决方案一&#xff1a;今天工作时在新建连接的时候遇到…

例题9-6 UVa11400 Lighting System Design(DP)

题意&#xff1a; 看白书 要点&#xff1a; 其他的白书上讲的比较清楚了&#xff0c;状态转移方程为&#xff1a;d[i] min(d[i], d[j] (s[i] - s[j])*bulb[i].c bulb[i].k)&#xff0c;有点难以理解的是如果i到j之中有的不进行换比较合理怎么办&#xff1f;但其实这种情况是…

【Silverlight】解决DataTemplate绑定附加属性

本文 Silverlight 版本&#xff1a;4.0。 首先定义数据类型&#xff0c;此文始终使用此定义类型。public class SimpleData : ViewModelBase{private string _text;private int _column, _row;public string Text { get { return _text; } set { _text value; OnPropertyChang…

青春无悔

青春像是一座城&#xff0c;放纵的思想、禁锢的世界总让自己感到如履薄冰&#xff0c;只能踽踽独行在阡陌的途中&#xff0c;我喜欢世界是自由的&#xff0c;我喜欢生活是淡然的&#xff0c;淡然的境界早已挣脱时空的枷锁&#xff0c;穿行在历朝历代&#xff0c;如莲花般盛开在…

java中udi_Java读取.properties配置文件的方法

java中的properties文件是一种配置文件&#xff0c;主要用于表达配置信息&#xff0c;文件类型为*.properties&#xff0c;格式为文本文件&#xff0c;文件的内容是格式是 "键值"的格式&#xff0c;在properties文件中&#xff0c;可以用"#"来作注释&#…