Dijkstra(迪杰斯特拉)算法代码详解

Dijkstra

是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。权值为非负,贪心策略。

关键代码

vector<int> Dijkstra(vector<vector<int>> matrix,int s) {	//matrix邻接矩阵,s源点
	int n = matrix.size();			//节点总数
	vector<int> dis(n,INF);			//distance记录最短路径长度,初始值无穷大(自定义常量)
	vector<int> par(n,-1);			//parent记录路径,初始值-1
	vector<int> vis(n,0);			//visited记录是否访问过,初始值为0

	dis[s] = 0;								//设源点的距离为0
	int k = s;								//k变量是当前访问的节点,初始为源点
	for (int i = 0; i < n; i++) {			//一次计算一个节点,循环n次
		vis[k] = 1;							//将当前访问中的节点设为已访问过
		for (int j = 0; j < n; j++) {		//循环与当前节点相连的节点,更新距离值
			if (vis[j] == 0 && dis[k] + matrix[k][j] < dis[j]) {	//如果节点j没有被访问过且经过k再到j的距离小于直接到j的距离时
				dis[j] = dis[k] + matrix[k][j];						//更新到达j点的距离
				par[j] = k;											//更新路径
			}
		}
		k = s;
		for (int j = 0; j < n; j++) {				//扫描距离信息找到所有未选节点中距离最小的那个节点
			if (vis[j] == 0) {						//判断是否访问过
				if (dis[j] < dis[k] || k == s) {	//k==s证明第一次进入循环,k被赋值为第一次找到的未访问节点,或者找到距离最小的节点
					k = j;							//最后得到距离最小节点进入下一次循环
				}
			}
		}
	}
	return par;
}

得到路径数组后,查询路径要从终点开始向起点推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值