最短路径之迪杰斯特拉算法(Java)

1)Dijkstra算法适用于求图中两节点之间最短路径

2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地方),其解决方法是通过比较每次循环中源节点到各个节点的权值来找出最小值即最短路径,然后再对各个权值进行修正,再循环。。。这种求最短路径的方式与图最小生成树算法之Kruskal(克鲁斯卡尔)算法有异曲同工之妙;

3)该算法的时间复杂度度是O(N^2),N是节点的个数。

源码:

package com.neuedu.algorithm;//算法

//最短路径之迪杰斯特拉
public class Dijkstra {
//初始化
//stark--->k
//stark--->k--->i的距离  < stark--->i的距离
//重复23步骤
	static int M=10000;//设置距离最大值表示此路不通
	public static void main(String[] args) {
		int [] [] weight= {
				{0,34,43,58,M,76,243},
				{342,0,M,54,M,32,4},
				{2,4,0,M,67,8,32},
				{6,98,34,0,M,5,55},
				{34,45,66,77,0,423,M},
				{2,4,340,M,67,0,32},
				{34,45,66,77,566,M,0}
		};
		int start=0;
		int [] shortPath=dijkstra(weight,start);
		for (int i = 0; i < shortPath.length; i++) {
			System.out.println(start+"到"+i+"的最短距离为:"+shortPath[i]);
		}
	}
	private static int[] dijkstra(int[][] weight, int start) {
		int n=weight.length;//确定有几个顶点
		int [] shortPath=new int[n];//记录从start到每个顶点的最短路径
		String [] path=new String[n];//记录从start到每个顶点最短路径经过的点
		int [] visited=new int[n];//记录每个点是否已获得最短路径
		for (int i = 0; i <n; i++) {
			path[i]= new String(start+"--->"+i);
		}
		shortPath[start]=0;
		visited[start]=1;
		for (int count = 1; count < n; count++) {
			int k=-1;//找出最短路径的点
			int dmin=Integer.MAX_VALUE;//记录最短路径
			for (int i = 0; i <n; i++) {
				if (visited[i]!=1&&weight[start][i]<dmin) {
					k=i;
					dmin=weight[start][i];
				}
			}
			System.out.println("k="+k);
			shortPath[k]=dmin;
			visited[k]=1;
			for (int i = 0; i <n; i++) {
				if (visited[i]!=1&&weight[start][k]+weight[k][i]<weight[start][i]) {
					path[i]=path[k]+"--->"+i;
					weight[start][i]=weight[start][k]+weight[k][i];
				}
			}
		}
		for (int i = 0; i < n; i++) {
			System.out.println(start+"到"+i+"的最短路径为:"+path[i]);
		}
		return shortPath;
	}
}

  

转载于:https://www.cnblogs.com/lc-java/p/7692761.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值