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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用