Dijkstra(迪杰斯特拉算法)的java实现

本文介绍了Dijkstra算法,一种用于图论中的最短路径计算的算法,并提供了Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个算法是图论算法的一种,可以实现求图中任意两个节点之间的最短距离

话不多说,直接上代码:

package my.demo.main;


import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

//迪杰斯特拉算法求图中任意两个节点的最短路径
public class Dijkstra {
	private int MAX=Integer.MAX_VALUE;
	private int[][] map=new int[][]{
		{0,1,5,MAX,MAX,MAX,MAX,MAX,MAX},
		{1,0,3,7,5,MAX,MAX,MAX,MAX},
		{5,3,0,MAX,1,7,MAX,MAX,MAX},
		{MAX,7,MAX,0,2,MAX,3,MAX,MAX},
		{MAX,5,1,2,0,3,6,9,MAX},
		{MAX,MAX,7,MAX,3,0,MAX,5,MAX},
		{MAX,MAX,MAX,3,6,MAX,0,2,7},
		{MAX,MAX,MAX,MAX,9,5,2,0,4},
		{MAX,MAX,MAX,MAX,MAX,MAX,7,4,0}
		
	};
	public static void main(String[] args) throws InterruptedException{
		Dijkstra demo=new Dijkstra();
		//demo.getResult(0);
		//System.out.println(demo.isTwoSame(demo.map));
		demo.getResult(1);
	}
	
	
	//获取计算结果,其中m要求的那个节点
	public void getResult(int m){
		int length=map.length;
		int[] result=new int[length];
		for(int i=0;i<result.length;i++){
			result[i]=map[m][i];
		}
		
		Set<Integer> set=new HashSet<>();
		int min=Integer.MAX_VALUE;
		int index=-1;
		//int sum=0;
		set.add(m);
		for(int k=0;k<length;k++){
			min=Integer.MAX_VALUE;
                      //找一维矩阵中的最小值,和下标,后面用这个小标来更新矩阵。
			for(int i=0;i<length;++i){
				if(!set.contains(i)){
					if(result[i]<min){
						min=result[i];
						index=i;
					}
				}
			}
			
			
			//更新一维矩阵
			if(index!=-1){
				set.add(index);
				for(int j=0;j<length;j++){
					if(!set.contains(j) && map[index][j]!=MAX && (min+map[index][j])<result[j]){
						result[j]=min+map[index][j];
					}
				}
			}
						
		}
		//输出结果
		System.out.println(Arrays.toString(result));

	}

	
	//判断矩阵是否为对称矩阵,防止一不小心输错了数据。
	public boolean isTwoSame(int[][] data){
		for(int i=0;i<data.length;i++){
			for(int j=i+1;j<data[i].length;j++){
				if(data[i][j]!=data[j][i]){
					//System.out.println(i+"-->"+j);
					//System.out.println(data[i][j]+"-->"+data[j][i]);
					return false;
				}
			}
		}
		return true;
	}
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值