Dijkstra算法的java实现


Dijkstra算法:用于单源最短路径的求解。用于计算给定的一个源节点到其他各个节点之间的最短路径。


该算法的思路是:已选定的节点集为A,待选的节点集为B。开始时节点A中仅包含源节点。

选择B中距离源节点最近的一个点,然后将它加入到节点集A中。该点加入后,更新B中所有节点到A的路径长度(借助刚加入的点)。之后重复这一步骤,直至所有点都加入。


以下图为例,做一个说明:



Dijkstra具体的java实现为:

package com.blyang;

public class Dijkstra {
	
	private final int INF = Integer.MAX_VALUE;
	
	int[][] Matrix;
	char[] Nodes;
	
	public Dijkstra(char[] Nodes, int[][] Matrix){
		this.Nodes = Nodes;
		this.Matrix = Matrix;
	}
	
	/**
	 * dijkstra算法
	 * 
	 * 参数说明:
	 * @param node  起点
	 * @param distance 长度数组,distance[i]表示从起点到i点的最短路径
	 */
	public void dijkstra(int node, int[] distance){
		
		boolean[] flag = new boolean[Nodes.length];
		
		//初始化
		for(int i=0; i<Nodes.length; i++){
			flag[i] = false;
			distance[i] = Matrix[node][i];
		}
		
		//对顶点node本身进行初始化
		flag[node] = true;
		distance[node] = 0;
		
		//遍历Nodes.length - 1次,每次找出一个顶点点最短路径
		int k = 0;
		for(int i=1; i<Nodes.length; i++){
			int min = INF;
			
			//寻找最短路径
			for(int j=0; j<Nodes.length; j++){
				if(flag[j] == false && distance[j] < min){
					k = j;
					min = distance[j];
				}
			}
			flag[k] = true;
			
			//更新Matrix点值
			for(int j=0; j<Nodes.length; j++){
				int len = Matrix[k][j] == INF ? INF : min + Matrix[k][j];
				if(flag[j] == false && len < distance[j]){
					distance[j] = len;
				}
			}
		}
		
		System.out.printf("Dijkstra(%c): \n", Nodes[node]);
		
		for (int i=0; i < Nodes.length; i++) 
            System.out.printf("  shortest(%c, %c)=%d\n", Nodes[node], Nodes[i], distance[i]);
		
		
	}
	

}


在实现了之后,针对上图的测试代码如下:

package com.blyang;

public class Main {


	
	public static void main(String[] args) {
		int INF = Integer.MAX_VALUE;
		
		char[] Nodes = {'0', '1', '2', '3'};
        int matrix[][] = {
                 /*A*//*B*//*C*//*D*/
          /*A*/ {    0,   1,   2,   1},
          /*B*/ {  INF,   0, INF, INF},
          /*C*/ {  INF,   3,   0,   1},
          /*D*/ {  INF,   1,   1,   0},
          };
        	
        int[] dist = new int[Nodes.length];
        
        Dijkstra dijkstra = new Dijkstra(Nodes, matrix);
        dijkstra.dijkstra(2, dist);
	
	}
	
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值