Dijkstra(迪杰斯特拉)算法

1. 算法描述

从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

2. 算法流程

①初始化dist、path、set。

②从通往当前剩余顶点的路径中选出长度最短的。

③以该顶点为中间点检测剩余顶点。

④循环至结束

例:


完整的Java代码:

package dijkstra;

public class Main {

	int n = 7;//顶点个数
	int dist[] = new int[7];//当前已找到的最短路径
	int edges [][] = new int[7][7];//存放权值信息
	int path [] = new int[7];//存放至终点的上一个顶点
	int set[] = new int[7];//标记某顶点是否并入最短路径
	
	public static void main(String[] args) {
		Main main = new Main();
		main.init();
		main.dijkstra();
		main.myPrint();
	}

	void dijkstra(){
		int v = 0;//起始点为0
		int min,i,j,u = 0;
		//初始化数组
		for(i=0;i<dist.length;i++){
			dist[i] = edges[v][i];
			set[i] = 0;
			if(edges[v][i]<Integer.MAX_VALUE){
				path[i] = v;
			}else{
				path[i] = -1;
			}
		}
		set[v] = 1;
		path[v] = -1;
		for(i=0;i<7;++i){
			min = Integer.MAX_VALUE;
			//从剩余顶点中选出一个顶点,通往该顶点的路径是剩余顶点中最小的
			for(j=0;j<7;++j){
				if(set[j]==0&&dist[j]<min){
					u = j;
					min = dist[j];
				}
			}
			set[u] = 1;
			//以刚并入的顶点为中间点,对所有通往剩余顶点的路径进行检测
			for(j=0;j<7;j++){
				if(set[j]==0&&edges[u][j]!=Integer.MAX_VALUE&&dist[u]+edges[u][j]<dist[j]){
					dist[j] = dist[u] + edges[u][j];
					path[j] = u;
				}
			}
		}
	}
	
	void init(){
		for(int i=0;i<7;i++){
			for(int j=0;j<7;j++){
				if(i!=j){
					edges[i][j] = Integer.MAX_VALUE;
				}
			}
		}
		edges[0][1] = 4;
		edges[0][2] = 6;
		edges[0][3] = 6;
		edges[1][2] = 1;
		edges[1][4] = 7;
		
		edges[2][4] = 6;
		edges[2][5] = 4;
		edges[3][2] = 2;
		edges[3][5] = 5;
		edges[4][6] = 6;
		
		edges[5][4] = 1;
		edges[5][6] = 8;
		
	}
	
	void myPrint(){
		System.out.println();
		for(int i=0;i<7;++i){
			System.out.print(dist[i]+" ");
		}
		System.out.println();
		for(int i=0;i<7;++i){
			System.out.print(path[i]+" ");
		}
		System.out.println();
		for(int i=0;i<7;++i){
			System.out.print(set[i]+" ");
		}
		System.out.println();
	}
}

备注:

①Integer.MAX_VALUE表示int所能表示的最大值0x7FFFFFFF,Java中int占4字节,一字节为8位。例:Integer.MAX_VALUE + 1 = Integer.MIN_VALUE;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra迪杰斯特拉算法是一种典型的最短路径算法,可以用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,使用的是广度优先搜索的思想。该算法通过不断更新起始点到其他节点的距离,选择当前距离最短的节点进行扩展,直到所有节点都被扩展完毕,找到起始点到其他节点的最短路径。Dijkstra算法在网络路由、地图导航等领域有广泛应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++实现Dijkstra(迪杰斯特拉)算法](https://download.csdn.net/download/weixin_38692122/12724830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Dijkstra迪杰斯特拉算法](https://blog.csdn.net/qq_43461641/article/details/100632351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [DijkstraAlgorithm(迪杰斯特拉算法)](https://blog.csdn.net/qq_45740348/article/details/113575420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值