Dijkstra算法 | 迪杰斯特拉算法-迷宫解算器可视化

2023-12-18 09:12

本文主要是介绍Dijkstra算法 | 迪杰斯特拉算法-迷宫解算器可视化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Dijkstra算法

该算法维护一组已访问的顶点和一组未访问的顶点。 它从源顶点开始,迭代地选择距源具有最小暂定距离的未访问顶点。 然后,它访问该顶点的邻居,如果找到更短的路径,则更新它们的暂定距离。 这个过程一直持续到到达目的地顶点,或者所有可到达的顶点都被访问过。

在许多应用中都需要 Dijkstra 算法,其中找到两点之间的最短路径至关重要。 例如,它可以用于计算机网络的路由协议,也可以用于地图系统来查找起点和目的地之间的最短路径。

Dijkstra 算法可以适用于有向图和无向图,因为该算法被设计为适用于任何类型的图,只要它满足具有非负边权重和连通性的要求。

  • 在有向图中,每条边都有一个方向,表示边所连接的顶点之间的行进方向。在这种情况下,算法在搜索最短路径时遵循边缘的方向。
  • 在无向图中,边没有方向,算法在搜索最短路径时可以沿着边向前和向后遍历。

算法过程

  1. 将当前距离标记为 0 的源节点,将其余节点标记为无穷大。
  2. 将当前距离最小的未访问节点设置为当前节点。
  3. 对于每个邻居,当前节点的N加上相邻节点的当前距离以及连接0->1的边的权重。如果小于Node当前距离,则将其设置为新的N当前距离。
  4. 将当前节点 1 标记为已访问。
  5. 如果还有未访问的节点,则转步骤2。

实现方式

实现 Dijkstra 算法的方法有多种,但最常见的是:

  1. 优先级队列(基于堆的实现)
  2. 基于数组的实现

代码实现

Python:

import heapqclass Node:def __init__(self, v, distance):self.v = vself.distance = distancedef __lt__(self, other):return self.distance < other.distancedef dijkstra(V, adj, S):visited = [False] * Vmap = {}q = []map[S] = Node(S, 0)heapq.heappush(q, Node(S, 0))while q:n = heapq.heappop(q)v = n.vdistance = n.distancevisited[v] = TrueadjList = adj[v]for adjLink in adjList:if not visited[adjLink[0]]:if adjLink[0] not in map:map[adjLink[0]] = Node(v, distance + adjLink[1])else:sn = map[adjLink[0]]if distance + adjLink[1] < sn.distance:sn.v = vsn.distance = distance + adjLink[1]heapq.heappush(q, Node(adjLink[0], distance + adjLink[1]))result = [0] * Vfor i in range(V):result[i] = map[i].distancereturn resultdef main():adj = [[] for _ in range(6)]V = 6E = 5u = [0, 0, 1, 2, 4]v = [3, 5, 4, 5, 5]w = [9, 4, 4, 10, 3]for i in range(E):edge = [v[i], w[i]]adj[u[i]].append(edge)edge2 = [u[i], w[i]]adj[v[i]].append(edge2)S = 1result = dijkstra(V, adj, S)print(result)if __name__ == "__main__":main()

C++:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3ftypedef pair<int, int> iPair;class Graph {int V; // No. of verticeslist<pair<int, int> >* adj;public:Graph(int V); // Constructorvoid addEdge(int u, int v, int w);void shortestPath(int s);
};Graph::Graph(int V)
{this->V = V;adj = new list<iPair>[V];
}void Graph::addEdge(int u, int v, int w)
{adj[u].push_back(make_pair(v, w));adj[v].push_back(make_pair(u, w));
}void Graph::shortestPath(int src)
{priority_queue<iPair, vector<iPair>, greater<iPair> >pq;vector<int> dist(V, INF);pq.push(make_pair(0, src));dist[src] = 0;while (!pq.empty()) {int u = pq.top().second;pq.pop();list<pair<int, int> >::iterator i;for (i = adj[u].begin(); i != adj[u].end(); ++i) {int v = (*i).first;int weight = (*i).second;if (dist[v] > dist[u] + weight) {dist[v] = dist[u] + weight;pq.push(make_pair(dist[v], v));}}}printf("Vertex Distance from Source\n");for (int i = 0; i < V; ++i)printf("%d \t\t %d\n", i, dist[i]);
}int main()
{int V = 7;Graph g(V);g.addEdge(0, 1, 2);g.addEdge(0, 2, 6);g.addEdge(1, 3, 5);g.addEdge(2, 3, 8);g.addEdge(3, 4, 10);g.addEdge(3, 5, 15);g.addEdge(4, 6, 2);g.addEdge(5, 6, 6);g.shortestPath(0);return 0;
}

迷宫解算器可视化

源代码

参阅一 - 亚图跨际
参阅二 - 亚图跨际

这篇关于Dijkstra算法 | 迪杰斯特拉算法-迷宫解算器可视化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507857

相关文章

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2