图(邻接矩阵)的最短路径

求图的最短路径,有两个经典的算法——dijkstra和floyd算法。

dijkstra算法适合稀疏图(邻接链表)求单点到其他点的最短路径。floyd算法适合稠密图(邻接矩阵)求各点到其他点的最短路径。邻接矩阵是图的一种简单的表示形式。dijkstra算法虽然适合邻接链表,算法题中也常用邻接矩阵实现。

宏定义点个数100,使用typedef定义边权重的类型int,方便程序的调试,同时用int(-1)表示两点间不存在边。

#define MAX_V 100

typedef int var;
const var NO_PATH = -1;

var map[MAX_V][MAX_V];

1.Dijkstra算法

dijkstra采用了贪婪技术,该算法有效的前提是图中没有负数权重的边。

一开始,被选择的点只有源点,每次选择离源点最近的一个未被选择的点,从这个点更新其余未被选择的点的最短距离。

/*dijkstra选择的路径和最短距离*/
int path_d[MAX_V][MAX_V];
var dist_d[MAX_V][MAX_V];
bool visited[MAX_V][MAX_V];

void dijkstra(int n,int s) {
	int *p = path_d[s];
	var *d = dist_d[s];
	bool *v = visited[s];
	for (int i = 0; i < n; i++) {
		d[i] = NO_PATH;
		p[i] = i;
	}
	d[s] = 0;
	while (1) {
		int j = -1;
		
有向邻接矩阵可以被用来求解最短路径,其中迪杰斯特拉算法是一个常用的方法。迪杰斯特拉算法用于解决单源最短路径问题,即从一个顶点出发,求解到其他所有顶点的最短路径。 首先,我们可以使用邻接矩阵来存储有向的边的关系。邻接矩阵是一个二维数组,数组的行和列分别代表中的顶点,而数组中的元素代表了顶点之间的边的权值。如果两个顶点之间存在边,则对应位置的元素值为边的权值;如果两个顶点之间不存在边,则对应位置的元素值为无穷大或者一个很大的数。 在迪杰斯特拉算法中,首先需要初始化一个距离数组,用来存储从源顶点到其他顶点的当前最短路径长度。然后,从源顶点开始,不断更新距离数组,直到找到所有顶点的最短路径。 具体步骤如下: 1. 初始化距离数组,将源顶点的距离设为0,将其他顶点的距离设为无穷大。 2. 选择一个顶点作为当前顶点,标记为已访问。 3. 更新当前顶点的邻居顶点的距离。如果通过当前顶点到达邻居顶点的路径长度小于邻居顶点当前的最短路径长度,则更新邻居顶点的最短路径长度。 4. 重复步骤3,直到所有顶点都被访问过或者找到最短路径。 5. 根据距离数组,可以得到从源顶点到其他顶点的最短路径。 在求解最短路径时,需要记录每个顶点的前驱顶点,以便在最后打印路径时能够回溯到源顶点。可以使用一个前驱数组来存储每个顶点的前驱顶点。 需要注意的是,迪杰斯特拉算法要求中的权值不能为负值,因为负权边可能导致算法陷入死循环。 因此,使用邻接矩阵和迪杰斯特拉算法可以求解有向最短路径。通过初始化距离数组、更新距离数组和记录前驱顶点,可以得到从源顶点到其他顶点的最短路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值