跳到主要内容

名古屋工業大学 工学研究科 工学専攻 情報工学系 2021年度 計算機ソフトウェア(データ構造とアルゴリズム)

Author

GPT-5.6 Sol, 祭音Myyura

Description

問題26「計算機ソフトウェア」の設問 I について答えよ。

頂点集合 VV を持つ有向グラフが与えられている。次のアルゴリズムは、開始頂点 sVs\in V から各頂点 vVv\in V までの経路を探し、そのコストを D[v]D[v] に保存する。cost(u,v)\operatorname{cost}(u,v) は有向辺 (u,v)(u,v) の正のコスト、\varnothing は空集合を表す。4 行目で候補が複数ある場合は、頂点のアルファベット順で選ぶ。

1  for (v ∈ V) { D[v] ← ∞ }
2 X ← ∅; D[s] ← 0
3 while (X ≠ V) {
4 u を D[v] (v ∉ X) が最小となる頂点とする
5 X ← X ∪ {u}
6 for (v ∈ {u から有向辺が存在する頂点}) {
7 D[v] ← min(D[v], D[u] + cost(u,v))
8 }
9 }

(1)

上のアルゴリズムを次の二つのグラフに適用し、1 回目の反復終了時とアルゴリズム終了時の DD を埋めよ。

グラフ 1 の辺は

(s,a,3),(s,b,1),(b,a,1)(s,a,3),\qquad(s,b,1),\qquad(b,a,1)

である。

D[s]D[s]D[a]D[a]D[b]D[b]
1 回目(A)33(B)
終了時(C)(D)11

グラフ 2 の辺は

(s,a,1), (s,b,3), (a,b,1), (b,a,4), (a,c,4), (b,c,2)(s,a,1),\ (s,b,3),\ (a,b,1),\ (b,a,4),\ (a,c,4),\ (b,c,2)

である。

D[s]D[s]D[a]D[a]D[b]D[b]D[c]D[c]
1 回目(E)(F)(G)\infty
終了時(H)(I)(J)(K)

(2)

次の各記述の正誤を答えよ。

  1. このアルゴリズムはクラスカル法と呼ばれる。
  2. グラフが閉路を持つ場合、終了しない可能性がある。
  3. 終了時の D[v]D[v] は、ss から vv までの最小コストである。
  4. 実行中に D[v]D[v] が増加することはない。

(3)

V=n|V|=n、有向辺数を mm とする。配列および辺コストへのアクセスと XVX\ne V の判定は O(1)O(1)、4--5 行目は 1 反復当たり O(n)O(n)、6--8 行目は uu の出次数に比例するものとする。最もタイトな計算量を選べ。

(a) O(m+n2),(b) O(m2+n2),(c) O(mn+n2),(d) O(m2+n).\begin{array}{ll} \text{(a) }O(m+n^2), & \text{(b) }O(m^2+n^2),\\ \text{(c) }O(mn+n^2),& \text{(d) }O(m^2+n). \end{array}

(4)

最短経路上で頂点 vv の直前にある頂点を P[v]P[v] に保存する。

(ア)

P[a]=s,P[b]=s,P[c]=d,P[d]=bP[a]=s,\qquad P[b]=s,\qquad P[c]=d,\qquad P[d]=b

のとき、ss から dd までの経路を選べ。

(a) s,a,b,d(b) s,b,c,d(c) s,b,d(d) s,c,d\text{(a) }s,a,b,d\quad \text{(b) }s,b,c,d\quad \text{(c) }s,b,d\quad \text{(d) }s,c,d

(イ)

同じ最小コストを持つ経路が複数ある場合、すべての直前頂点を集合 P[v]P[v] に保存する。

P[a]={s},P[b]={s},P[c]={s,a,b},P[d]={b,c}P[a]=\{s\},\quad P[b]=\{s\},\quad P[c]=\{s,a,b\},\quad P[d]=\{b,c\}

のとき、ss から dd までの異なる最短経路数を求めよ。

(5)

最短経路数を N[v]N[v] に保存する。初期値を N[s]=1N[s]=1vsv\ne s に対して N[v]=0N[v]=0 とし、7 行目を次のように置き換える。空欄を埋めよ。

if (D[v] > D[u] + cost(u,v)) {
D[v] ← D[u] + cost(u,v)
N[v] ← (A)
} else if (D[v] = D[u] + cost(u,v)) {
N[v] ← (B)
}

Kai

(1)

グラフ 1 では最初に ss を選び、

D[a]=3,D[b]=1D[a]=3,\qquad D[b]=1

となる。次に bb を選ぶと

D[a]=min(3,1+1)=2D[a]=\min(3,1+1)=2

である。したがって、

(A)=0, (B)=1, (C)=0, (D)=2\boxed{(A)=0,\ (B)=1,\ (C)=0,\ (D)=2}

となる。

グラフ 2 では最初に ss を選び、

(D[s],D[a],D[b],D[c])=(0,1,3,)(D[s],D[a],D[b],D[c])=(0,1,3,\infty)

となる。その後 a,b,ca,b,c の順に選ばれ、

D[b]=min(3,1+1)=2,D[c]=min(1+4,2+2)=4.D[b]=\min(3,1+1)=2,\qquad D[c]=\min(1+4,2+2)=4.

よって、

(E)=0, (F)=1, (G)=3, (H)=0, (I)=1, (J)=2, (K)=4\boxed{(E)=0,\ (F)=1,\ (G)=3,\ (H)=0,\ (I)=1,\ (J)=2,\ (K)=4}

である。

(2)

  1. \boxed{\text{誤}}。これはクラスカル法ではなくダイクストラ法である。
  2. \boxed{\text{誤}}。各反復で新しい頂点が XX に加わるため、高々 V|V| 回で終了する。
  3. \boxed{\text{正}}。すべての辺のコストが正なので、確定した距離は最短距離である。
  4. \boxed{\text{正}}。更新は最小値との置換だけなので、D[v]D[v] は増加しない。

(3)

4--5 行目は nn 回反復され、合計 O(n2)O(n^2) である。6--8 行目の総計は出次数の総和より O(m)O(m) である。したがって、

O(n2)+O(m)=O(m+n2)O(n^2)+O(m)=O(m+n^2)

であり、答えは (a)\boxed{\text{(a)}} である。

(4)

(ア)

P[d]=bP[d]=bP[b]=sP[b]=s を逆向きにたどると dbsd\leftarrow b\leftarrow s である。よって、

sbd(c)\boxed{s\to b\to d}\qquad\boxed{\text{(c)}}

となる。

(イ)

各頂点までの経路数を C(v)C(v) とすると、

C(s)=1,C(a)=C(b)=1,C(s)=1,\qquad C(a)=C(b)=1,
C(c)=C(s)+C(a)+C(b)=3,C(d)=C(b)+C(c)=4.C(c)=C(s)+C(a)+C(b)=3,\qquad C(d)=C(b)+C(c)=4.

したがって、答えは 4\boxed{4} 本である。

(5)

より短い経路が得られた場合は従来の経路数を捨て、uu までの経路数で置き換える。同じ距離の経路が得られた場合は、その経路数を加える。よって、

(A)=N[u],(B)=N[v]+N[u]\boxed{(A)=N[u]},\qquad \boxed{(B)=N[v]+N[u]}

である。

検算

ダイクストラ法を実装して各反復を記録したところ、グラフ 1 は

(0,3,1)(0,2,1),(0,3,1)\to(0,2,1),

グラフ 2 は

(0,1,3,)(0,1,2,5)(0,1,2,4)(0,1,3,\infty)\to(0,1,2,5)\to(0,1,2,4)

となった。また、前駆頂点集合から 4 本の経路を列挙でき、上の結果と一致した。