Dijkstra算法(Java实现)

Dijkstra提出按各顶点与源点v间的路径长度的递增次序,生成到各顶点的最短路径的算法。即先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从源点v 到其它各顶点的最短路径全部求出为止。

下面是代码实现:

package com.algorithm.impl;

public class Dijkstra {
	private static int M = 10000; //此路不通
	public static void main(String[] args) {
		int[][] weight1 = {//邻接矩阵
                {0,3,2000,7,M},
                {3,0,4,2,M},
                {M,4,0,5,4},
                {7,2,5,0,6},
                {M,M,4,6,0}
        };  

        int[][] weight2 = {
                {0,10,M,30,100},
                {M,0,50,M,M},
                {M,M,0,M,10},
                {M,M,20,0,60},
                {M,M,M,M,0}
        };

        int start=0;
        int[] shortPath = dijkstra(weight2,start);  

        for(int i = 0;i < shortPath.length;i++)
             System.out.println("从"+start+"出发到"+i+"的最短距离为:"+shortPath[i]);
	}

	public static int[] dijkstra(int[][] weight, int start) {
		//接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)
        //返回一个int[] 数组,表示从start到它的最短路径长度
		int n = weight.length;           //顶点个数
		int[] shortPath = new int[n];    //保存start到其他各点的最短路径
		String[] path = new String[n];   //保存start到其他各点最短路径的字符串表示
		for(int i=0;i<n;i++)
			path[i]=new String(start+"-->"+i);
		int[] visited = new int[n];     //标记当前该顶点的最短路径是否已经求出,1表示已求出 

		//初始化,第一个顶点已经求出
		shortPath[start] = 0;
		visited[start] = 1;

		for(int count = 1; count < n; count++) {     //要加入n-1个顶点
			int k = -1;               //选出一个距离初始顶点start最近的未标记顶点
			int dmin = Integer.MAX_VALUE;
			for(int i = 0; i < n; i++) {
				if(visited[i] == 0 && weight[start][i] < dmin) {
					dmin = weight[start][i];
					k = i;
				}
			}

			//将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin
			shortPath[k] = dmin;
			visited[k] = 1;

			//以k为中间点,修正从start到未访问各点的距离
			for(int i = 0; i < n; i++) {
				if(visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]) {
					weight[start][i] = weight[start][k] + weight[k][i];
					path[i] = path[k] + "-->" + i;
				}
			}
		}
		for(int i = 0; i < n; i++) {
			System.out.println("从"+start+"出发到"+i+"的最短路径为:"+path[i]);
		}
		System.out.println("=====================================");
		return shortPath;
	}
}

运行结果为:

从0出发到0的最短路径为:0-->0
从0出发到1的最短路径为:0-->1
从0出发到2的最短路径为:0-->3-->2
从0出发到3的最短路径为:0-->3
从0出发到4的最短路径为:0-->3-->2-->4
=====================================
从0出发到0的最短距离为:0
从0出发到1的最短距离为:10
从0出发到2的最短距离为:50
从0出发到3的最短距离为:30
从0出发到4的最短距离为:60
时间: 2024-10-13 21:48:17

Dijkstra算法(Java实现)的相关文章

Dijkstra算法 java实现

/* * 设置一个U集合,包含最小路径长度和上一个结点 * V-U集合表示还没有进行调整 * 把V-U集合逐渐加入U中,并调整最小路径 * */ public class Dijkstra { private static int MAX = 10000; public static void dijkstra(GraphMatrix grap, Path dist[]){ // 初始化V0 init(grap,dist); int n = dist.length; int minw = MAX

基于无向图且权重单一的最短路径Dijkstra算法——JAVA实现

做一个无向图的权重单一的最短路径算法. 模拟停车场最近车位的选择. 首先参考了博友JavaMan_chen的博文 http://blog.csdn.net/javaman_chen/article/details/8254309 但是这个算法是有问题的. 算法中,如果A点是当前点,是选取距离A点权重最小的那一点作为下一个路径点的. 这就带来了一个问题,即,距离A点的2个点如果权重相同,那就会随机选取其中一条. 于是,在数据量稍微大点的时候,就出错了. 在这里使用Dijkstra算法使用的是用OP

最短路径算法之Dijkstra算法(java实现)

前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备: 1.表示图的数据结构 用于存储图的数据结构有多种,本算法中笔者使用的是邻接矩阵.  图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 从上面可以看出,无向图的边

Dijkstra算法java现实

先上一张路径图 一共有8个点,每个点之间的连线数字,表示这两个点之间的距离,如果两个点之间无直接连线,那么只能通过其它点到达. Dijkstra算法,网上有逼格较高的定义,描述文字不是太通俗,且不管它. 下面就以求A到G的最短路径为例,谈一下具体的算法实现思路: 前提条件:定义一个close集合,分析过的点都放入此集合中,A为起点,首先放入集合. 1.以A为起点,首先寻找离A最近的相连的某个点(上图是C点) 2.找到这个C点后,循环C相连的所有点(其实B和D),重新计算A到B,A到D的临时最短距

Dijkstra算法Java实现

从最短路径开始,学习Dijstar算法 下面是求最短路径问题描述: 下面是Dijkstar算法的描述: 下面是使用Dijkstar算法求解右图中的问题: 下面是图的邻接矩阵: 下面是计算过程: 下面是求解最短路径: 下面是Java代码实现,其中需要注意的问题我已经标出(一定要细心!!!!): package greedy_algorithm; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSe

(HW)Dijkstra算法(Java)

1 import java.util.Comparator; 2 import java.util.HashMap; 3 import java.util.LinkedList; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.PriorityQueue; 7 import java.util.Stack; 8 9 public class test 10 { 11 public static void ma

Dijkstra算法(三)之 Java详解

前面分别通过C和C++实现了迪杰斯特拉算法,本文介绍迪杰斯特拉算法的Java实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想

Dijkstra算法求最短路径(java)(转)

原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:1.声明两个集合,open和close

Dijkstra算法应用之Java实现

缘来是你: 前几天在博客园里,有小伙伴贴出华为2010年10K(薪资)员工3级晋级试题. 问题主要是算法实现. 在师兄大批入住华为的环境下,作为一名热爱算法的小伙伴,也想小试一下身手. 问题地址:http://www.cnblogs.com/preacher/p/4126261.html 在解决上述问题前先来复习一下基础知识: Dijkstra最短路径算法 上述问题放在下一期随笔上 算法简析: Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达

最短路径——dijkstra算法(Java)

在刷题的过程中常常会遇到求最短路径的问题,在求无权图的问题中我们常常使用BFS来求其最短路径,而BFS无法解决网(有权图)中的问题,我们解决网中的最短路径常常使用dijkstra算法来求解. dijkstra算法是一种贪心的思想,具体其正确性的证明,这里就不再赘述.下面来直接讲解如何使用dijkstra算法: 1.我们在使用dijkstra算法时为了其编写的便捷性一般使用邻接矩阵来描述一个图.并将邻接矩阵中每个元素的值初始化为无穷大(或者很大很大的值).之后根据图中的结构加入数字,称这个矩阵为E