以下は消費税です。
特定のグラフ問題では、頂点はエッジの重みの代わりに、またはエッジの重みに加えて重みを持つことができます。Cv を頂点 v のコストとし、C(x,y) をエッジ (x, y) のコストとします。この問題は、グラフ G の頂点 a と b の間の最も安価なパスを見つけることに関係しています。パスのコストは、パス上で遭遇するエッジと頂点のコストの合計です。
(a) グラフの各エッジの重みがゼロであると仮定します (エッジ以外のコストは ∞ です)。すべての頂点 1≤v≤n に対して Cv =1 であると仮定します (つまり、すべての頂点のコストは同じです)。 . a から b への最も安い経路とその時間計算量を見つけるための効率的なアルゴリズムを与えてください。
(b) ここで、頂点コストが一定ではなく (ただし、すべて正である)、エッジ コストが上記のままであるとします。a から b への最も安い経路とその時間計算量を見つけるための効率的なアルゴリズムを与えてください。
(c) ここで、エッジと頂点の両方のコストが一定ではないとします (ただし、すべて正です)。a から b への最も安い経路とその時間計算量を見つけるための効率的なアルゴリズムを与えてください。
これが私の答えです:
(a) 通常の BFS を使用します。
(b) ダイクストラのアルゴリズムを使用しますが、重みを頂点の重みに置き換えます。
(c)
ダイクストラのアルゴリズムも使用する
エッジの重みだけを考慮すると、ダイクストラのアルゴリズムの重要な部分は次のようになります。
if (distance[y] > distance[v]+weight) {
distance[y] = distance[v]+weight; // weight is between v and y
}
ここで、頂点の重みについて考えると、次のようになります。
if (distance[y] > distance[v] + weight + vertexWeight[y]) {
distance[y] = distance[v] + weight + vertexWeight[y]; // weight is between v and y
}
私は正しいですか?
(c) に対する私の答えは単純すぎると思いますね。