最短路径dijkstra算法

基本思路

1、维护一个距离表数组dis,dis[i] 表示通过已访问节点从起点到节点i 的最短路径。
2、每次访问dis最小、且未访问的节点,更新dis表。

例子

在这里插入图片描述
用邻接矩阵graph存储:
在这里插入图片描述

过程演示

1、初始起点0为已访问,同时初始dis表
在这里插入图片描述
2、dis[2]最小且节点2未访问,故访问节点2,并更新dis表。节点2和节点3、5邻接,且节点3、5未访问,且通过节点2到达节点3、5
路径更短,故更新dis[3]、dis[5]。
在这里插入图片描述
2、dis[1]最小且节点1未访问,故访问节点1,并更新dis表。节点1和节点3、4邻接,且节点3、4未访问,且通过节点1到达节点3、4
路径更短,故更新dis[3]、dis[4]。
在这里插入图片描述
3、重复上述步骤直到访问完所有节点。
在这里插入图片描述

代码

const int cnt = 7;				
void Dijkstra(int graph[][cnt])
{
	int dis[cnt] = {INT_MAX};			// 距离表
	bool visited[cnt] = {0};				// 访问标记
	
	// 初始化
	visited[0] = true;						// 节点0标记为已访问
	for (int i = 1; i < cnt; i++)			// 遍历更新距离表
		dis[i] = graph[0][i];
		
	for (int i = 1; i < cnt; i++)
	{
		// 查找未被访问节点距离表中的最小值
		int minIndex = 0;			// 距离表最小值下标
		for (int j = 1; j < cnt; j++)
		{
			if (!visited[j] && dis[j] < dis[minIndex])
				minIndex = j;
		}
		
		visited[minIndex] = true;
		
		// 更新距离表
		for (int k = 1; k < cnt; k++)
		{
			if (!visited[k] && graph[minIndex][k] < INT_MAX && graph[minIndex][k] + dis[minIndex] < dis[k])
				dis[k] = graph[minIndex][k] + dis[minIndex];
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值