首页 > 编程语言 >数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法

数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法

时间:2023-02-09 12:31:28浏览次数:45  
标签:Dijkstra map int 之迪杰 算法 顶点 include dis


迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径,它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。

1. 算法步骤;

1. 初始时,引进两个集合S和U,S只包含起点s,U包含除s外的其他顶点,且U中顶点的距离为起点s到该顶点的距离;

2. 从U中选出距离最短的顶点k,并将顶点k加入到S中,同时,将从U中移除顶点k;

3. 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离。

4. 重复步骤2和3,直到遍历完所有顶点。

2. 算法实例;

以图G4为例,以D为起点对该算法进行演示。

数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法_i++

 以下是实现步骤

数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法_数据结构_02

3. 算法实现;

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int inf = 1 << 29;

int main(){
int map[10][10], t1, t2, t3, min, u, n, m;
int dis[10];
int vis[10];
scanf("%d%d", &n, &m);
// 初始化
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (i == j){
map[i][j] = 0;
}else{
map[i][j] = inf;
}
}
};
// 读入边
for (int i = 1; i <= m; i++){
scanf("%d%d%d", &t1, &t2, &t3);
map[t1][t2] = t3;
};
// 初始化dis数组,表示1号顶点到其余各个顶点的最短路程
for (int i = 1; i <= n; i++){
dis[i] = map[1][i];
};
// 初始化vis
for (int i = 1; i <= n; i++){
vis[i] = 0;
};
// 标记起始点1已经被访问过
vis[1] = 1;
// 迪杰斯特拉算法(Dijkstra)的核心内容
// 因为松弛的是边数,所以是n-1
for (int i = 1; i <= n - 1; i++){
min = inf;
for (int j = 1; j <= n; j++){
if (vis[j] == 0 && dis[j] < min){
min = dis[j];
u = j;
}
};
vis[u] = 1;
for (int v = 1; v <= n; v++){
if (map[u][v] < inf){
if (dis[u] + map[u][v] < dis[v]){
dis[v] = dis[u] + map[u][v];
}
}
}
};
for (int i = 1; i <= n; i++){
printf("%d ", dis[i]);
}
return 0;
}

由以上代码中的循环可知,迪杰斯特拉(Dijkstra)算法的时间复杂度是O(n^2)

标签:Dijkstra,map,int,之迪杰,算法,顶点,include,dis
From: https://blog.51cto.com/u_15959833/6046814

相关文章

  • 爬树的甲壳虫(扩展欧几里得算法)
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmaxn=1e5+10;constintMOD=998244353;llx[maxn],y[maxn];//快速幂模板ll......
  • 算法16:归并排序_相关面试题 (超难)
    归并排序(MergeSort)就是利用归并的思想实现排序方法。它的原理是假设初始序列含义n个记录,则可以看成是n个有序子序列,每个序列的长度为1,然后两两归并,得到【n/2】([x]表示不......
  • 算法15:冷门面试题_队列实现栈,栈实现队列
     经常有些面试官很变态,一般都是老阴逼级别的,喜欢问一些变态的问题。但是,反过来思考一下,这些题目也确实具备一些动手的能力,变相能够考查面试者的coding能力。面试一:怎么......
  • 算法随想Day6【哈希表】| LC344-反转字符串、LC541-反转字符串Ⅱ、JZ-替换空格、LC151
    LC344.反转字符串voidreverseString(vector<char>&s){intsize=s.size();intleft=0,right=size-1;while(left<right){s[l......
  • 《分布式技术原理与算法解析》学习笔记Day05
    分布式共识什么是分布式共识?分布式共识就是在多个节点均可独自操作或记录的情况下,使得所有节点针对某个状态达成一致的过程。有哪些常见的分布式共识算法?一般有3种分布......
  • 快速幂算法
    <center>基础算法</center>快速幂快速幂就是快速算底数的n次幂。其时间复杂度为O(log₂N),朴素的直接乘的复杂度为O(N),显然快速幂效率有很大的提高。解决问题:计算一个......
  • 前端页面分页算法 js+php
    实现效果: 实现思路:通过当前选中页码数值和总页码数量,计算返回结果,以数组的形式返回。遍历数组内容,完成页面渲染。 php算法:/***getNavigatePage**@......
  • 算法基础
    参考:csdn,沓沓781,http://t.csdn.cn/HG47y 函数基础定义一个函数包括:返回类型、函数名称、形参列表、函数体例如:intsum(intn){intsum=0;for(......
  • 感知机:学习算法之原始形式【统计学习方法】
    概述学习问题训练数据集:$$T={(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)}$$其中,$x_i\in\mathcalX\subseteq\boldsymbolR^n,y_i\in\mathcalY={+1,-1}$损失函数:$$L(w,b)=\su......
  • 程序员必备的数据库知识 2:Join 算法
    前言连接(Join)是关系数据库重要特性,它和事务常被作为数据库与文件系统的两个重要区别项。程序员江湖一直流传着某某baba的神秘开发宝典,其中数据库部分有重要一条避免过多表......