数据结构--最短路径算法(Dijkstra算法)

最短路径算法–Dijkstra算法算法思路:先加入一个节点作为初始结点,然后每轮添加一个节点,这样n - 1轮后就可以得到从初始结点到所有结点的最小距离。这里我们要用到三个辅助数组:S[i]、path[i]、dist[i],他们分别用来记录结点i是否已经加入到最短路径、加入的结点i的前驱结点、初始结点到结点i的距离。接下来我们初始化三个数组,S[i]数组初始化全为0,加入初始结点0,S[0...
摘要由CSDN通过智能技术生成

最短路径算法–Dijkstra算法

算法思路:

先加入一个节点作为初始结点,然后每轮添加一个节点,这样n - 1轮后就可以得到从初始结点到所有结点的最小距离。
这里我们要用到三个辅助数组:S[i]、path[i]、dist[i],他们分别用来记录结点i是否已经加入到最短路径、加入的结点i的前驱结点、初始结点到结点i的距离。
接下来我们初始化三个数组,S[i]数组初始化全为0,加入初始结点0,S[0] = 1;path[i]数组初始化全为0,表示他们的前驱结点都是0结点,而0结点无前驱结点,path[0] = -1;dist[i]数组初始化的值为初始结点0到i结点的距离。
接下来循环n - 1次,每次都找到当前dist[i]数组中最小的值,把i结点添加到最短路径中且标记S[i] = 1,然后从新添加的i结点去查找它的出边,如果有出边,若出边的边长加上到新加入的i结点的距离小于初始结点到出边结点的距离,则更新初始结点到出边结点的最短距离以及到出边结点的前驱结点,这样执行n - 1轮,S[i]数组的值全变成1,这样就得到了我们就得到从初始结点到其他所有结点的最短距离以及路径。

代码实现:

#include<iostream>
using namespace std;
#define MaxVertexNum 10//定义最大数组 
#define MAX 10000//最大值
typedef char VertexType;//结点名称的类型 
typedef int EdgeType;//结点权重的类型 

typedef struct{
   //图的结构体 
	VertexType Vex[MaxVertexNum];//结点数组 
	EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵--权值的二维数组 
	int vexnum, arcnum;//节点数、边数 
}Graph;//结构体的名称 

void Dijkstra(Graph G, int v){
   //v为选择的初始结点的下标,该算法可以算出初始结点即下标为j的结点到图的其他结点的最短路径 
	int s[G.vexnum];//辅助数组--用来记录结点是否被选择 
	int path[G.vexnum];//辅助数组--用来记录初始结点到每个结点的最短路径的前驱结点 
	int dist[G.vexnum];//辅助数组--用来记录初始结点到每个结点的最短距离 
	for(int i = 0; i < G
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值