实验2:最短路径的求法(Floyd、Dijkstra)

本文详细介绍了如何使用Floyd和Dijkstra算法来求解两个顶点之间的最短路径。Floyd算法通过不断迭代更新矩阵,Dijkstra算法则利用优先队列逐步确定最短路径。同时,文章提供了伪代码和源码实现。
摘要由CSDN通过智能技术生成

1. 问题

分别用Floyd、Dijkstra算法求两个顶点间的最短距离

**

2.解析

Floyd:
算法Dk[i][j] = 路径{ i {lk}j }的最小长度
D0,D1,…,D|V|-1[i][j]即给出了i到j的真正最短距离
最初的D-1是什么?
当Dk-1已经完成,递推到Dk时:或者k最短路径{i{lk}j},则Dk =Dk-1或者k 最短路径{i {lk}j },则该路径必定由两段最短路径组成:Dk[i][j]=Dk1[i][k]+Dk1[k][j]

Dijkstra:
算法令S={源点s+已经确定了最短路径的顶点vi}对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过S中的顶点。即路径{s(viS)v}的最小长度

**
**

3.设计(伪代码)

void Floyd() {
	for (i = 0; i < N; i++) {
		for (j = 0; j < N; j++) {
			D[i][j] = G[i][j];
			path[i][j] = -1;
		}
		for (k = 0; k < N; k++) {
			for (i = 0; i < N; i++) {
				for (j = 0; j < N; j++) {
					if (D[i][k] + D[k][i] < D[i][j]) {
						D[i][j] = D[i][k] + D[k][j];
						path[i][j] = k;
					}
				}
			}
		}
	}
}

**
Dijktra

void Dijkstra(Vertex s) {
	while (1) {
		v = 未收录顶点中dist最小者;
			if(这样的v不存在)
			break;
		collected[v] = true;
		for(v的每个邻接点w)
			if(collected[w]==false)
				if (dist[v] + E(e, w) < dist[w]) {
					dist[w] = dist[v] + E(v, w);
					path[w] = v;
				}
	}
}

**

4.源码

**
1:Floyd算法
2:Dijstra算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值