調整重み付きグラフでは、正確に k 個のエッジを持つ最短パスを見つける問題には、正確に k 個のエッジをナビゲートするときに最小の重みを持つパスを決定することが含まれます。これは、考えられるすべての方法で最小限の重みを保存する 3D フレームワークの採用など、動的プログラミング戦略を採用することによって実現されます。計算は頂点とエッジで繰り返され、各ステップで最小重みが調整されます。正確に k 個のエッジを持つすべての可能な方法を考慮することにより、計算では、グラフ内に k 個のエッジを持つ最も限定された方法を区別できます。
単純な再帰的メソッド
エッジ制約のあるダイクストラのアルゴリズム
単純な再帰的手法は、複雑な問題をより小さなサブ問題に分解し、それらを再帰的に解決することを含む、問題解決のための重要かつ明確な戦略となる可能性があります。このアプローチでは、基本ケースに到達するまで、作業自体が複数回呼び出され、サブ問題を調査します。それにもかかわらず、二重にカウントしたり、サブ問題をカバーしたりするため、より大きな問題の場合は無駄になる可能性があります。メモリやエネルギープログラミングなどの最適化方法が必要です。だまされやすい再帰的メソッドは入手して実装するのが簡単ですが、時間の複雑さが指数関数的に増加する可能性があります。これは、小規模な問題を解決するため、またはより最適な計算の開始点としてよく使用されます。
###アルゴリズム###
######二番目。 k が 1 で、グラフ内の u と v の間にエッジがある場合、その重みが返されます。
c. k が 0 以下の場合は、無制限を返します (負またはゼロのエッジは許可されないため)。
無限変数 res を初期化して、最短パス距離を保存します。
グラフは次のようにすべての頂点を反復する必要があります:
a. u と i が u または v まで上昇しない場合、u から i へのエッジが存在します:
shortestPath を再帰的に呼び出します。ここで、i はモダンなソース頂点、v はターゲット頂点、k−1 は残りのエッジの数です。
返された結果が無限でない場合、res は res の最小値、現在のエッジと再帰結果の重みにアップグレードされます。
k 個のエッジを正確に分離する最も限定的な方法として res の値を返します。
エッジ制約のあるダイクストラのアルゴリズム
ソース: 最も制限されたパスの開始頂点
#include <iostream> #include <vector> #include <limits> struct Edge { int destination; int weight; }; void dijkstra(const std::vector<std::vector<Edge>>& graph, int source, std::vector<int>& distance) { int numVertices = graph.size(); std::vector<bool> visited(numVertices, false); distance.resize(numVertices, std::numeric_limits<int>::max()); distance[source] = 0; for (int i = 0; i < numVertices - 1; ++i) { int minDistance = std::numeric_limits<int>::max(); int minVertex = -1; for (int v = 0; v < numVertices; ++v) { if (!visited[v] && distance[v] < minDistance) { minDistance = distance[v]; minVertex = v; } } if (minVertex == -1) break; visited[minVertex] = true; for (const auto& edge : graph[minVertex]) { int destination = edge.destination; int weight = edge.weight; if (!visited[destination] && distance[minVertex] != std::numeric_limits<int>::max() && distance[minVertex] + weight < distance[destination]) { distance[destination] = distance[minVertex] + weight; } } } } int main() { int numVertices = 4; int source = 0; std::vector<std::vector<Edge>> graph(numVertices); // Add edges to the graph (destination, weight) graph[0] = {{1, 10}, {2, 3}}; graph[1] = {{2, 1}, {3, 7}}; graph[2] = {{3, 6}}; std::vector<int> distance; dijkstra(graph, source, distance); // Print the shortest distances from the source vertex std::cout << "Shortest distances from vertex " << source << ":\n"; for (int i = 0; i < numVertices; ++i) { std::cout << "Vertex " << i << ": " << distance[i] << '\n'; } return 0; }
Shortest distances from vertex 0: Vertex 0: 0 Vertex 1: 10 Vertex 2: 3 Vertex 3: 9
本文概述了两个重要的计算,以帮助理解协调和加权图表中的大多数问题。它阐明了易受骗的递归方法和带有边缘限制的 Dijkstra 计算。轻信递归方法包括递归地研究具有精确 k 个边的所有可能的方式,以发现最有限的方式。 Dijkstra 的边命令式计算采用了所需的线和面积规则,成功地找出了图表中从供给顶点到所有不同顶点的最大受限方式。本文包含了计算的具体说明,并给出了测试代码来说明其用法.
以上が有向重み付きグラフで、正確に k 個のエッジを含む最短パスを見つけます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。