检查给定的图中两个节点之间的路径是否表示最短路径
要检查图表的两个中心之间的给定路径是否符合最短路径,可以通过使用可靠的最短路径将沿给定路径的整个边缘权重与相同中心组合之间的最短距离进行比较方式计算,例如 Dijkstra 计算或 Floyd−Warshall 计算。如果给定路径上的所有边权重与最有限的删除相匹配,那么它就代表最简单的路径。另外:如果整个边权重比最短距离更突出,则表明图表中两个中心之间存在较短的距离。
使用的方法
Dijkstra 算法
具有边缘反转成本的 Floyd−Warshall 算法
贪心算法
Dijkstra 的计算可能是一种流行的图表遍历计算,用于发现图表中源中心与所有其他中心之间最有限的路径。在检查两个中心之间的给定路径是否与最有限路径相关的情况下,Dijkstra 的计算可用于计算这些中心之间的最有限间隔。通过从起始枢纽运行 Dijkstra 的计算,我们得到所有其他枢纽的最有限的间隔。如果给定的路线与两个枢纽之间的最有限距离相匹配,那么它就表示一条实质性且最短的路线。其他:如果给定的路线比计算的最短距离长,则表明图表中存在更短的路线。
算法
创建最短路径(图形、源、目的地):
初始化一组“过去”来存储去往中心的距离,并初始化一个单词参考间隔来存储最有限的距离。
在分隔字典中将源集线器的间隔设置为无限,并将所有其他中心的间隔设置为无限。
虽然存在未访问的节点,
a。选择与分隔词参考距离最小的中心并将其标记为已访问。
b。对于当前节点的每个邻居集线器:
通过将边权重添加到当前节点的距离来计算临时间隔。
如果条件间距小于存放间距,则检修距离。
如果在分离中从源到目标的最短距离与给定路径长度收支平衡,则返回 true(给定路径表示最短路径)。其他情况,返回 false。
此计算利用 Dijkstra 方法来计算最短间隔,然后将从源到目标的最短距离与给定的路径长度进行比较,以确定是否是最短的路径.
示例
#include <iostream> #include <vector> #include <queue> #include <limits> using namespace std; const int INF = numeric_limits<int>::max(); bool shortestPath(vector<vector<pair<int, int>>>& graph, int source, int destination, int pathLength) { int numNodes = graph.size(); vector<int> distances(numNodes, INF); distances[source] = 0; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.emplace(0, source); while (!pq.empty()) { int u = pq.top().second; int dist = pq.top().first; pq.pop(); if (dist > distances[u]) continue; for (auto& neighbor : graph[u]) { int v = neighbor.first; int weight = neighbor.second; if (dist + weight < distances[v]) { distances[v] = dist + weight; pq.emplace(distances[v], v); } } } return (distances[destination] == pathLength); } int main() { int numNodes = 6; vector<vector<pair<int, int>>> graph(numNodes); // Build the graph graph[0].emplace_back(1, 2); graph[0].emplace_back(2, 5); graph[1].emplace_back(3, 4); graph[1].emplace_back(4, 1); graph[2].emplace_back(3, 2); graph[3].emplace_back(4, 3); graph[3].emplace_back(5, 6); graph[4].emplace_back(5, 2); int source = 0; int destination = 5; int pathLength = 8; bool isShortestPath = shortestPath(graph, source, destination, pathLength); if (isShortestPath) cout << "The given path represents a shortest path." << endl; else cout << "The given path does not represent a shortest path." << endl; return 0; }
输出
The given path does not represent a shortest path.
具有边缘反转成本的 Floyd−Warshall 算法
Floyd-Warshall 计算是一种动态编程计算,用于发现图表中所有中心对之间的最短路径。在检查两个中心之间的给定路径是否与最有限路径相关的情况下,Floyd-Warshall 计算可用于计算图表中所有中心集之间的最短间隔。通过将计算得到的最短距离与给定路径上的全部边权重进行比较,我们就可以确定给定路径是否涉及最有限的路径。如果整个边权重与最短的间隔相匹配,则此时给定的路径可能是图表中两个中心之间最有限的路径。算法
制作一个测量 numNodes x numNodes 的二维格子,并为所有节点集将其初始化为无限 (INF)。
将 dist 的角对角加法设置为 0。
对于图表中权重为 w 的每个协调边 (u, v),将 dist[u][v] 彻底修改为 w,将 dist[v][u] 修改为 w w_reversal,其中 w_reversal 是反转通过边(v,u)的方式获取。
在固定循环后执行 Floyd−Warshall 计算:
对于从 numNodes 到 1 之间的每个中途集线器,请执行以下操作:
对于从 numNodes 到 1 的集线器 i 和 j 的每个聚合,将 dist[i][j] 改进到以下值中的最小值:
距离[i][j]
距离[i][k]距离[k][j]
计算完成后,考虑到边缘反转成本,dist 将包含所有集线器组之间最有限的间隔。
要检查两个枢纽(源和目标)之间的给定路线是否为最简短的路线,请将给定路线的长度与距离 [源] [目的地] 进行比较。如果是的话,给定的方式是最有限的方式。
示例
#include <iostream> #include <vector> using namespace std; const int INF = 1e9; void floydWarshall(vector<vector<int>>& graph, int numNodes) { vector<vector<int>> dist(graph); // Distance matrix initialized with the graph for (int k = 0; k < numNodes; k++) { for (int i = 0; i < numNodes; i++) { for (int j = 0; j < numNodes; j++) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } // Printing the shortest distances cout << "Shortest distances between all pairs of nodes:" << endl; for (int i = 0; i < numNodes; i++) { for (int j = 0; j < numNodes; j++) { if (dist[i][j] == INF) cout << "INF "; else cout << dist[i][j] << " "; } cout << endl; } } int main() { int numNodes = 4; // Number of nodes // Adjacency matrix representation of the graph with edge weights and edge reversal costs vector<vector<int>> graph = { {0, 5, INF, 10}, {INF, 0, 3, INF}, {INF, INF, 0, 1}, {INF, INF, INF, 0} }; floydWarshall(graph, numNodes); return 0; }
输出
Shortest distances between all pairs of nodes: 0 5 8 9 INF 0 3 4 INF INF 0 1 INF INF INF 0
结论
本文探讨了如何检查图表的两个中心之间的给定路径是否代表最有限的路径。它阐明了两种方法:Dijkstra 计算和获取边缘反转的 Floyd-Warshall 计算。 C 中的代码用法说明了这些计算。它还简要说明了计算及其用途。本文旨在帮助读者了解如何在图表中找到最有限的方法,并确定给定的方法是否无疑是最简单的。
以上是检查给定的图中两个节点之间的路径是否表示最短路径的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Windows11具有如此多的自定义选项,包括一系列主题和壁纸。虽然这些主题以自己的方式是美学,但一些用户仍然想知道他们在Windows11上的后台位置。本指南将展示访问Windows11主题背景位置的不同方法。什么是Windows11默认主题背景?Windows11默认主题背景是一朵盛开的抽象宝蓝色花朵,背景为天蓝色。这种背景是最受欢迎的背景之一,这要归功于操作系统发布之前的预期。但是,操作系统还附带了一系列其他背景。因此,您可以随时更改Windows11桌面主题背景。主题背景存储在Windo

文件路径是操作系统中用于识别和定位文件或文件夹的字符串。在文件路径中,常见的有两种符号分隔路径,即正斜杠(/)和反斜杠()。这两个符号在不同的操作系统中有不同的使用方式和含义。正斜杠(/)是Unix和Linux系统中常用的路径分隔符。在这些系统中,文件路径是以根目录(/)为起始点,每个目录之间使用正斜杠进行分隔。例如,路径/home/user/Docume

由于技术错误,无法播放此视频。(错误代码:102006)本指南提供了针对此常见问题的简单修复,并继续您的编码之旅。我们还将讨论Java错误的原因以及将来如何防止它。什么是Java中的“错误:找不到或加载主类”?Java是一种强大的编程语言,使开发人员能够创建广泛的应用程序。然而,它的多功能性和效率伴随着开发过程中可能发生的一系列常见错误。其中一个中断是错误:找不到或加载主类user_jvm_args.txt,当Java虚拟机(JVM)找不到主类来执行程序时会出现这种情况。此错误充当了障碍,甚至在

标题:C++中Prim算法的使用及代码示例引言:Prim算法是一种常用的最小生成树算法,主要用于解决图论中的最小生成树问题。在C++中,通过合理的数据结构和算法实现,可以有效地使用Prim算法。本文将介绍如何在C++中使用Prim算法,并提供具体的代码示例。一、Prim算法简介Prim算法是一种贪心算法,它从一个顶点开始,逐步扩展最小生成树的顶点集合,直到包

Win11系统中“我的电脑”路径有何不同?快速查找方法!随着Windows系统的不断更新,最新的Windows11系统也带来了一些新的变化和功能。其中一个常见的问题是用户在Win11系统中找不到“我的电脑”的路径,这在之前的Windows系统中通常是很简单的操作。本文将介绍Win11系统中“我的电脑”的路径有何不同,以及快速查找的方法。在Windows1

在Linux系统中,RPM(RedHatPackageManager)是一种常见的软件包管理工具,用于安装、升级和删除软件包。有时候我们需要找到某个已安装的RPM文件的存储路径,以便进行查找或者其他操作。下面将介绍在Linux系统中如何查找RPM文件的存储路径,同时提供具体的代码示例。首先,我们可以使用rpm命令来查找已安装的RPM包及其存储路径。打开

Linux内核是一个开源的操作系统内核,其源代码存储在一个专门的代码仓库中。在本文中,我们将详细解析Linux内核源代码的存放路径,并通过具体的代码示例来帮助读者更好地理解。1.Linux内核源代码存放路径Linux内核源代码存储在一个名为linux的Git仓库中,该仓库托管在[https://github.com/torvalds/linux](http

Python3.x中如何使用os.path模块获取文件路径的各个部分在日常的Python编程中,我们经常需要对文件路径进行操作,例如获取路径的文件名、文件目录、扩展名等等。在Python中,可以使用os.path模块来进行这些操作。本文将介绍如何使用os.path模块来获取文件路径的各个部分,以便更好地操作文件。os.path模块提供了一系
