ホームページ  >  記事  >  バックエンド開発  >  有向重み付きグラフで、正確に k 個のエッジを含む最短パスを見つけます。

有向重み付きグラフで、正確に k 個のエッジを含む最短パスを見つけます。

PHPz
PHPz転載
2023-09-11 19:17:02942ブラウズ

有向重み付きグラフで、正確に k 個のエッジを含む最短パスを見つけます。

調整重み付きグラフでは、正確に k 個のエッジを持つ最短パスを見つける問題には、正確に k 個のエッジをナビゲートするときに最小の重みを持つパスを決定することが含まれます。これは、考えられるすべての方法で最小限の重みを保存する 3D フレームワークの採用など、動的プログラミング戦略を採用することによって実現されます。計算は頂点とエッジで繰り返され、各ステップで最小重みが調整されます。正確に k 個のエッジを持つすべての可能な方法を考慮することにより、計算では、グラフ内に k 個のエッジを持つ最も限定された方法を区別できます。

使用説明書

  • 単純な再帰的メソッド

  • エッジ制約のあるダイクストラのアルゴリズム

単純な再帰的方法

単純な再帰的手法は、複雑な問題をより小さなサブ問題に分解し、それらを再帰的に解決することを含む、問題解決のための重要かつ明確な戦略となる可能性があります。このアプローチでは、基本ケースに到達するまで、作業自体が複数回呼び出され、サブ問題を調査します。それにもかかわらず、二重にカウントしたり、サブ問題をカバーしたりするため、より大きな問題の場合は無駄になる可能性があります。メモリやエネルギープログラミングなどの最適化方法が必要です。だまされやすい再帰的メソッドは入手して実装するのが簡単ですが、時間の複雑さが指数関数的に増加する可能性があります。これは、小規模な問題を解決するため、またはより最適な計算の開始点としてよく使用されます。

###アルゴリズム###

    グラフ、ソース頂点 u、ターゲット頂点 v、およびエッジの数 k を入力として受け取る作業最短パス (グラフ、u、v、k) を表します。
  • 基本的な状況を確認してください:
  • a. k と u が v と均衡する場合に返します (この場合、エッジは許可されないため)。
  • ######二番目。 k が 1 で、グラフ内の u と v の間にエッジがある場合、その重みが返されます。

  • c. k が 0 以下の場合は、無制限を返します (負またはゼロのエッジは許可されないため)。

  • 無限変数 res を初期化して、最短パス距離を保存します。

  • グラフは次のようにすべての頂点を反復する必要があります:

  • a. u と i が u または v まで上昇しない場合、u から i へのエッジが存在します:

  • shortestPath を再帰的に呼び出します。ここで、i はモダンなソース頂点、v はターゲット頂点、k−1 は残りのエッジの数です。

  • 返された結果が無限でない場合、res は res の最小値、現在のエッジと再帰結果の重みにアップグレードされます。

  • k 個のエッジを正確に分離する最も限定的な方法として res の値を返します。

  • ###例### リーリー ###出力### リーリー

    エッジ制約のあるダイクストラのアルゴリズム

  • エッジ制約を備えたダイクストラのアルゴリズムは、ソース頂点とグラフ上の他のすべての頂点の間の最短パスを特定するグラフ走査計算です。これは、最大または最小のエッジの重みなど、グラフのエッジの制限または制約を考慮します。この計算では、必要な頂点ラインが保持され、削除する頂点が最も少ないものを繰り返し選択します。この時点で、より短いパスが見つかった場合は、隣接する頂点間の距離を広げることで隣接する頂点を緩和します。この準備は、すべての頂点が訪問されるまで続きます。エッジ コマンドを使用したダイクストラのアルゴリズムは、最も制限された方法を見つけながら、選択した方法が必要なエッジ制約を満たすことを保証します。 ###アルゴリズム###

次のパラメータを使用してダイクストラのアートワークを作成します

グラフ: 頂点とエッジを含む入力グラフ

ソース: 最も制限されたパスの開始頂点

制約: エッジの制限または障害物
  • 消滅した頂点のセットと需要ラインを初期化して、頂点とその距離を保存します。

  • 削除クラスターを作成し、ソース頂点を除くすべての頂点の削除を終了可能に設定します。ソース頂点は 0 に設定されます。

    ソース頂点を距離に応じて目的の行に配置します。

    需要パイプラインはパージできませんが、次のことを行ってください:
  • エリミネーション数が最も少ない頂点を目的のキューからデキューします。
  • 頂点が現在アクセスされていない場合は、
  • 訪問済みとしてマークします。
  • モダン頂点の隣接する各頂点:
  • エッジ バリアを適用して、エッジを考慮できるかどうかを判断します。
  • エッジの重みと制約を考慮して、フィード頂点から隣接する頂点までの未使用の距離を計算します。
  • 現在の区切り文字が最新の区切り文字より短い場合は、区切り文字の配列を改善します。
  • 未使用の距離にある隣接する頂点を目的の行にキューに入れます。
  • すべての頂点に到達した後、別のクラスターには、供給頂点からエッジ制約を満たす各頂点までの最大短距離が含まれます。
  • 個々のクラスターを結果として返します。

示例

#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 サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。