最短路径—Digskra算法

本文介绍了Dijkstra算法的一种模板实现,用于寻找图中指定起点到终点的最短路径。算法首先初始化visited数组和最短距离数组dist,然后逐步将未访问过的节点中距离源点最近的节点加入最短路径集合,更新其他节点的最短路径。注意处理未连接节点间的距离应设为无穷大,并在最后输出目标点的最短路径。
摘要由CSDN通过智能技术生成

最短路径问题很是经典,本文也不对原理做介绍了有太多大佬,我讲得不好

只介绍一种算法模板(结点从下标0开始)

void DIG(int start, int end)   //计算结点start到end的最短路径
{
	//初始化visited数组
	memset(visited, 0, sizeof(visited));    //刚开始谁都没访问过,cstring头文件
	for (int i = 0; i < vex; ++i) {
		dist[i] = value[start][i];     //源点start到各个结点的最小距离
	}
	//将源点放到最短路径结点集合中
	visited[start] = 1;
	//更新最短距离数组
	dist[start] = 0;
	int num = 1;   //每一轮循环将一个数值放入到最短路径结点集合中
	while (num < vex)
	{
		//找出剩余节点中路径最短的结点
		int minn = inf;
		int t_i = 0;  //记录最短路径结点的下标
		for (int i = 0; i < vex; ++i) {
			//前提是不在最短路径结点集合中
			if (visited[i] == 0 && minn > dist[i]) {
				minn = dist[i];   //就是那个最短路径的数值
				t_i = i;
			}
		}
		//将刚刚找到的节点加入到集合中
		visited[t_i] = 1;   //已经标记了
		num++;    //最短路径结点结合中结点数加1
		//将这个结点加入到路径中后,更新所有节点到源点地最短路径
		for (int i = 0; i < vex; ++i) {
			//对非集合中的节点的最短路径进行更新
			if (visited[i] == 0 && (dist[i] > dist[t_i] + value[t_i][i]))
			{
				//原来源点距离i的距离大于刚刚取得结点的最短路径加上该点至i的路径距离
				dist[i] = dist[t_i] + value[t_i][i];
			}
		}
	}
	//输出重点end的最短路径   ---判断一下end值是否有效
	if (end >= 0 && end < vex) {
		cout << dist[end] << endl;
	}
}

需要注意的点:

1.若两个点未连接,则设为inf(无穷大)

2.初始化标记数组visited,可以用memset函数,头文件cstring

3.最关键的思想就是:找出未加入最短路径结点集合中结点,然后更新最短路径数组dist中源节点至各个节点的最短路径【超级重要】

4.后续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hskwcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值