首页 > 编程语言 >迪杰斯特拉算法

迪杰斯特拉算法

时间:2023-08-05 17:11:14浏览次数:45  
标签:distance point INT MAX 迪杰 -- 算法 斯特拉 dis

迪杰斯特拉算法(单源最短路径)

算法基本流程:node 0 as start. 注意算法流程默认图是联通的,若不联通,需要添加循环跳出处理。

image-20230805163622438

step Node 0 Node 1 Node 2 Node 3 visited point set
0 ( init ) 0 INT_MAX INT_MAX INT_MAX {}
1 0 (√) 3 1 INT_MAX
2 0 (√) 3 1 (√) 9
3 0 (√) 3(√) 1 (√) 9
4 0 (√) 3(√) 1 (√) 9(√)

注意步骤是:先找点加入visited set, 再更新距离。

循环次数即为点的个数。

step0:初始化,除了起点本身距离为0,到其余点的距离均为INT_MAX,且目前所有点均未被访问;

step1:找到起点距离最近的点为本身node:0,将node 0加入visited set,,再计算从点0出发的到未访问点的新距离是否可以更小;

如在step2时,新加入了点2,从点2出发查找所有未访问的点{1, 3},于是发现dis(0-->1) = dis(0-->2) + dis(2-->1) = 3,不更新;

dis(0-->3) = INT_MAX, dis(0-->2) + dis(2-->3) = 9, 后者小于前者,于是更新dis(0-->3) = 9;

以下步骤相同,不再赘述。

伪代码表述:

Init the distance vector as INT_MAX;
Set distance[start]=0;
Init the visited vector as False;

For step in (0, n-1):
	# 每次访问一个点,这个点是距离start最近的点,将其加入现在已经访问的节点集合中
	minP, minD;
	For point in points_all:
		If(point not visited and minD > distance[point]):
			minP = point;
			minD = distance[point];
	# 找到最近的点后,根据这个节点更新目前的可访问距离
	Find point with minium distance in unvisited point set;
	Update distance vector.

实际代码:

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
#define M INT_MAX
ostream& operator<<(ostream& os, vector<int>& dis) {

    for(int d : dis){
        os<<d<<" ";
    }
    return os;
}
int main(){
    int n=4; // 节点数量
    vector<int> visited(n, 0); // 访问标记
    vector<vector<int>> map={{0, 3, 1, M},
                             {3, 0, 2, 10},
                             {1, 2, 0, 8},
                             {M, 10, 8, 0},}; // 每两个点之间的距离二维矩阵
    vector<int> distance(n, M);
    int start = 0;
    distance[start] = 0;
    int count = 0;
    while(count++ < n){
        // 找一个距离start最近的未访问点添加到已经访问节点中
        int minPoint, minDis = INT_MAX;
        for(int i=0; i<n; i++){
            if(!visited[i] && minDis > distance[i]){
                minDis = distance[i];
                minPoint = i;
            }
        }
        visited[minPoint] = 1;
        // 更新距离列表
        for(int j=0; j<n; j++){
            if(map[minPoint][j] != INT_MAX && map[minPoint][j] + distance[minPoint] < distance[j]){
                // 这个地方为了防止int溢出,也可以用减号:distance[j]-distance[minPoint] > map[][]
                distance[j] = map[minPoint][j] + distance[minPoint];
            }
        }
    }
    cout<<distance<<endl;
}

标签:distance,point,INT,MAX,迪杰,--,算法,斯特拉,dis
From: https://www.cnblogs.com/fireinstone/p/17608236.html

相关文章

  • C/C++ 数据结构五大核心算法之回溯法-N皇后问题
    N皇后问题:在n*n的棋盘上要摆n个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数n,返回n皇后的摆法数。#include<iostream>#include<math.h>#defineN8usingnamespacestd;intq[N+1];//q[i]表示第i个皇后在第i行上的第q[i]列intcheck(i......
  • 数据结构-算法-01-算法初步
     ......
  • 【数据结构 | 入门】堆栈与队列(问题引入&实现&算法优化)
    ......
  • 代码随想录算法训练营第四十六天| 84.柱状图中最大的矩形
     84.柱状图中最大的矩形要求:有多个矩形,要求返回可能勾勒出的最大矩形思路:寻找右边第一个小于当前节点的index寻找左边第一个小于当前节点的index 右边:累加的方式,如果当前节点小于,那么判读后放进去左边,放进去了之后,当前节点后一个,就是左边最小的代码:1//要求:和相......
  • 算法工程师学习运筹学 笔记二 线性规划
    线性规划 框架图先放在这里图片由知乎@运筹说提供,原文链接:https://zhuanlan.zhihu.com/p/382644742  线性规划模型标准型 标准型如上目标函数求max;约束条件两端用“=”连结;右端常数项非负;所有决策变量非负。(如有决策变量没有约束,则把该变量拆成两个正数变量......
  • 算法竞赛命题指南(命题流程、Polygon的使用等)
    一.引言命好一场题目,是一个艰巨的任务。它非常考察个人水平和团队合作能力。在出题前,你应该做好以下准备:抱有认真负责的态度出题是给别人做的,比起展示自己,更多是为了是服务他人。算法竞赛是选手之间的竞赛,而不是出题人与做题人之间的较量。因此,出题不应以考倒选手为目标(当然,适当的......
  • 代码随想录算法训练营第十天| 232.用栈实现队列 225. 用队列实现栈
    232.用栈实现队列   卡哥建议:大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。  题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html   做题思路:   记住栈和队列的......
  • 2021中国华录杯·算法大赛直通车!
    各位小伙伴们大家好,由天津市委网信办、天津市工业和信息化局、津南区人民政府、中国华录集团主办,北京易华录信息技术股份有限公司承办的2021中国华录杯·数据湖算法大赛自启动以来获得各位小伙伴的广泛支持,现在插播几条重要通知,千万不要错过哦!报名截止时间数据引领时代,AI创造未来。......
  • 近200万奖金!仅限在校生!DIGIX全球校园AI算法大赛来了
     Datawhale赛事 主办方:江苏省人工智能学会、华为2021 DIGIX全球校园AI算法精英大赛由江苏省人工智能学会、华为终端云服务、华为南京研究所共同举办。大赛自2019年启动以来,将AI理论技术与真实业务场景深度结合,助力校园开发者将学习成果用于实战中。大赛特邀了周志华等教授组成顾......
  • [刷题笔记][算法模型总结] Luogu P1880 [NOI1995] 石子合并 || 区间dp之合并石子模型
    ProblemSolution本题还有一个弱化版,见LuoguP1775我们发现本题和弱化版唯一区别就是本题有环。我们先将弱化版的内容。EasyversionDescription弱化版是给定了好多堆石子,每相邻的两堆可以合并成一个大堆,每次合并会产生两个石头重量和的价值,最后会将若干堆石子合并为一堆。......