算法设计与分析 实验二 Floyd算法和Dijkstra算法

Floyd算法

用Floyd算法求解下图各个顶点的最短距离。
在这里插入图片描述
用一个邻接矩阵存储有向图中各个顶点的距离,从1号点开始,假设1号点直接到2号点的初始路径是graph[0][1],1号经过3号点到达2号点的路径就是graph[0][2]+graph[2][1],如果graph[0][2]+graph[2][1]< graph[0][1],则说明1号经过3号点到达2号点的路径更短,故更新邻接矩阵中1号点到2号点的路径,重复更新每个点的路径,最终得到的邻接矩阵就是这个有向图各个顶点的最短路径。
(1)更新经过2号到达各点后的邻接矩阵得:
在这里插入图片描述
(2)更新经过3号到达各点后的邻接矩阵得:
在这里插入图片描述
(3)更新经过4号到达各点后的邻接矩阵,最终得到各个顶点之间的最短路径的邻接矩阵:
在这里插入图片描述核心代码如下:

	//Floyd算法
	public static int[][] floyd(int[][] graph) {
		for(int k=0;k<graph.length;k++) {
			for(int i=0;i<graph.length;i++) {
				for(int j=0;j<graph.length;j++) {
					if(graph[i][j]>graph[i][k]+graph[k][j]) {
						graph[i][j]=graph[i][k]+graph[k][j];
					}
				}
			}
		}
		return graph;	
	}

Dijkstra算法

对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。
在这里插入图片描述
用一个一维数组dist[]来存储顶点a到各个顶点的初始距离。假设INF为不可达。
(1)、从顶点a开始,在dist[]数组中找出距离最近的点b,将{b}收录进集合中,并更新各点的最短距离。
(2)、从dist[]数组中找出距离最近的一个点d,将{b,c}收录进集合中,并更新各点的最短距离。
(3)、从dist[]数组中找出距离最近的一个点d,将{b,d,c}收录进集合中,并更新各点的最短距离。
(4)、从dist[]数组中找出距离最近的一个点f,将{b,d,c,f}收录进集合中,并更新各点的最短距离。
(5)、从dist[]数组中找出距离最近的一个点e,将{b,d,c,f,e}收录进集合中,并更新各点的最短距离。
(6)、从dist[]数组中找出距离最近的一个点g,将{b,d,c,f,e,g}收录进集合中,并更新各点的最短距离。
(7)、从dist[]数组中找出距离最近的一个点h,将{b,d,c,f,e,g,h}收录进集合中,并更新各点的最短距离,此时得到顶点a到顶点h的最短路径为a-b-d-c-f-e-g-h。

在这里插入图片描述
核心代码如下:

//初始化点a的初始路径
		for (int i = 1; i < dist.length; i++) {
			dist[i]=graph[0][i];
		}
		visit[0]=1;
		
		for(int i=1;i<dist.length;i++) {
			int min=INF,temp=0;
			for (int j = 1; j < dist.length; j++) {
				//如果该点未访问
				if(visit[j]!=1&&dist[j]<min) {
					min=dist[j];
					temp=j;
				}
			}
			visit[temp]=1;
			for (int j = 0; j < dist.length; j++) {
				if(graph[temp][j]+dist[temp]<dist[j]) {
					dist[j]=graph[temp][j]+dist[temp];
				}
			}
		}

时间复杂度分析

Floyd算法时间复杂度分析
在这里插入图片描述
Dijkstra算法时间复杂度分析
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值