最短路径算法 Dijkstra和Prim详解

本文主要介绍了最短路径算法中的Dijkstra算法和Prim算法,Dijkstra算法适用于单源最短路径,而Prim算法适用于多源最短路径。文章详细阐述了两种算法的数据结构定义、核心思想,并提供了参考代码。
摘要由CSDN通过智能技术生成

前言

这几次面试的确有好多次问到了最短路径算法,当时答得确实不好,对算法理解的不是很透彻,下面简单梳理一下。

Dijkstra算法

Dijkstra算法有点DP的意思,适用于单源最短路径算法且要求边的权值非负,同时可以用于有向图和无向图。

数据结构定义:
  • map[][]:存放原始图;
  • dis[]:存放从源点出发到达点i的最短路径长度;
  • visited[]:记录节点是否已被访问。
    初始化:
  • dis[i] = map[0][i],从源点出发到达各点的距离,无法到达记为INT_MAX;
  • visited(map.size(), 0), visited[0] = 1,初始只访问过源点。
思想:

双集合的说法可以查到很多,也解释的很详细,这里说一下我的理解。记源点为A。

  • 遍历dis数组(一共做n-1次),找到目前从源点出发,到达未访问节点i的最短路径;
  • 更新visited数组,置visited[i] = 1
  • 更新目前源点经由i中转到未访问节点的最短路径(假设i=B),如A->B->C,C为一未访问节点。这里的目前是指现在只能保证A->B的路径最短,更新得到的A->B->C路径只能保证现在是最短的。
    但是绝不可能有经过某一节点j中转到达i的路径比这一步找到的路径短,因为后面找到的可以从源点A到达的未访问点(假设目前找到了A->B,存在B<->C,):
    • 要么本来A可以访问到C;存在A->C,则有A->C->B,如果A->C->B的路径短于A->B,则必有A->C的路径短于A->B的路径,那么这一步找到的最短路径便是A->C,不会是A->B;
    • 要么本来A访问不到C;此时访问到C,只有A->B->C,假如有一条路径可以经过C和其他节点到达B,如A->B->C->D->B,因为到达C首先已经经过了B,在经由C中转到达B的路径必包含A->B->C,这种情况不可能发生。
  • 重复上述过程n-1次,即可找到从源点出发到达任意节点的最短路径。
参考代码
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector<int> Dijkstra(vector<vector<int>> &map);

int main(int argc, char *argv[]) {
   
	const int M = INT_MAX;
	vector<vector<int>> map
	{
   
		{
   0,6,3,M,M,M},
		{
   6,0,2,5,M,M},
		{
   3,2,0,3,4,M},
		{
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值