これは、アルゴリズム設計マニュアルの演習です。
与えられた無向グラフ G = (V, E) に長さ 3 の三角形または閉路が含まれているかどうかを判断する問題を考えてみましょう。
(a) O(|V |^3) を与えて、三角形が存在する場合にそれを見つけます。
(b) 時間 O(|V |·|E|) で実行されるようにアルゴリズムを改善します。|V | と仮定することができます。≤ |E|。
これらの境界により、G の隣接行列と隣接リスト表現の間で変換する時間が得られることに注意してください。
ここに私の考えがあります:
(a) グラフが隣接リストとして与えられている場合、O(|V|^2) でリストを行列に変換できます。それから私は:
for (int i = 0;i < n;i++)
for (int j = i+1;j < n;j++)
if (matrix[i][j] == 1)
for (int k = j+1;k < n;k++)
if (matrix[i][k] == 1 && matrix[j][k] == 1)
return true;
これにより、三角形をテストするための O(|V|^3) が得られるはずです。
(b) 私の最初の直感は、グラフが隣接リストとして与えられた場合、bfs を実行するということです。クロス エッジが見つかった場合はいつでも、たとえば 、if y-x is a cross edge
次に を実行しcheck whether parent[y] == parent[x], if true, then a triangle is found
ます。
私の考えが正しいかどうか誰か教えてくれませんか?
この(b)についても、その複雑さはわかりません。O(|V| + |E|) でいいじゃないですか。
O(|V|*|E|) でどうすればいいですか?