ネットワークスペシャリスト 2024年 午前2 問05
問題文
5個のノードA〜Eから構成される図のネットワークにおいて、Aをルートノードとするスパニングツリーを構築した。このとき、スパニングツリー上で隣接するノードはどれか。ここで、図中の数値は対応する区間のコストを表すものとする。

選択肢
ア:AとE
イ:BとC
ウ:CとD
エ:DとE(正解)
🔒 解説は解答すると表示されます
ルートAの最短経路木【午前2解説】
正解の理由
Aを根とする最短経路木(単一始点最短路木)を構成すると、各ノードはAからの最短距離に基づいて一つの親(前駆ノード)を持ちます。本問のグラフに対してダイクストラ法で最短距離を求めると、ノードDの最短経路はA→B→E→D(距離6)であり、A→B→C→D(距離7)より短くなります。したがってノードDの親はEとなり、辺EDが最短経路木に含まれます。これにより隣接するノードの組として正しいのは エ(DとE)です。
解法ステップ
- 初期化:、他は 。前駆ノードは未設定。
- Aを確定(最短距離0)。隣接更新:
- (前駆 B←A)
- (前駆 E←A)
- (前駆 D←A)
- 最小未確定はB()。Bを確定、隣接更新:
- E について → (前駆 E←B)
- C について → (前駆 C←B)
- 次にE()を確定、隣接更新:
- D について → (前駆 D←E)
- C について → (前駆 C←E)
- 次にC()を確定。C→Dの候補は のため更新なし。
- 最後にD()を確定。結果として前駆関係は
- B←A(辺 AB)
- E←B(辺 BE)
- C←E(辺 CE)
- D←E(辺 ED) となり、スパニングツリー(最短経路木)は辺AB, BE, CE, EDを含みます。
選択肢別の誤答解説
-
ア: Aと E
A→Eの直接辺(重み4)は存在しますが、A→B→Eの経路が重み3と短いため、Eの前駆はBになり、ABまたはBEは木に入りますがAEは入らないため誤りです。 -
イ: Bと C
B–C(重み4)は存在しますが、最短経路木でのCの前駆はE(A→B→E→Cの経路重み4)であり、CとBは隣接しません。したがって誤りです。 -
ウ: Cと D
辺C–D(重み3)自体は存在しますが、Dの最短経路はE経由(合計6)であり、C経由だと合計7になるためDの親はEです。よってCとDは隣接しません。 -
エ: Dと E
Dの前駆がE(E→Dの辺が最短経路木に含まれる)であるため、ノードDとEはスパニングツリー上で隣接します。
よくある誤解
-
「スパニングツリー=最小全域木」と混同する
スパニングツリーは「木で全頂点をつなぐ」こと一般を指しますが、問題は「Aをルートとする」最短経路木(単一始点最短路木)を問うため、目的関数が異なります。最小全域木(MST)は全辺の総和を最小にする木であり、アルゴリズムや結果が異なります(Prim/Kruskal vs Dijkstra)。 -
「辺の重みが小さい方が必ず選ばれる」との誤認
個々の辺の重みではなく、ルートからの経路合計(最短距離)が基準です。局所的に小さい辺があっても、ルートからの合計が大きければ最短経路木には入らないことがあります。 -
同距離の扱いに注意
複数経路で同じ最短距離になる場合、前駆の選び方(アルゴリズム実装や優先度の扱い)で最短経路木は一意にならないことがあります。本問ではDの経路はE経由が一意に短いため影響しません。
補足コラム
-
アルゴリズム対応表
- 最短経路木(単一始点):ダイクストラ法(非負重み)やベルマン–フォード(負辺あり)
- 最小全域木(MST):Prim法、Kruskal法
-
今回のグラフで使われた「前駆ノード」の概念
最短経路木は各ノードに「そのノードへ至る最短経路の直前のノード(前駆)」を割り当てることで表現できます。最終的な木はこれら前駆ノードの集合(親子辺)で得られます。 -
実装例(ダイクストラで前駆を出力)
import heapq
G = {
'A': [('B',1),('E',4),('D',7)],
'B': [('A',1),('E',2),('C',4)],
'C': [('B',4),('E',1),('D',3)],
'D': [('A',7),('E',3),('C',3)],
'E': [('A',4),('B',2),('C',1),('D',3)],
}
def dijkstra(start):
dist = {v: float('inf') for v in G}
prev = {v: None for v in G}
dist[start] = 0
pq = [(0, start)]
while pq:
d,u = heapq.heappop(pq)
if d>dist[u]: continue
for v,w in G[u]:
nd = d + w
if nd < dist[v]:
dist[v] = nd
prev[v] = u
heapq.heappush(pq, (nd, v))
return dist, prev
dist, prev = dijkstra('A')
print(dist) # {'A':0,'B':1,'C':4,'D':6,'E':3}
print(prev) # {'A':None,'B':'A','C':'E','D':'E','E':'B'}
FAQ
Q1: 「スパニングツリー」の定義とここでの意味は?
A1: スパニングツリーはすべての頂点を含む木のことです。本問では「Aを根とする」最短経路木が目的であり、各ノードはAからの最短経路に基づいて親を持ちます。
A1: スパニングツリーはすべての頂点を含む木のことです。本問では「Aを根とする」最短経路木が目的であり、各ノードはAからの最短経路に基づいて親を持ちます。
Q2: エッジの単独の重みが小さいほど木に選ばれるか?
A2: 単独の重みだけで判断しません。Aからの経路全体の合計距離が短くなるかどうかで選ばれます。
A2: 単独の重みだけで判断しません。Aからの経路全体の合計距離が短くなるかどうかで選ばれます。
Q3: 最短経路が複数ある場合はどうなる?
A3: 最短距離は同じでも前駆の決定は実装(ヒープや探索順)に依存し、木は一意にならないことがあります。試験問題では通常一意に定まるように設計されていますが、図で複数候補が示される場合は明示的な条件に従って判断します。
A3: 最短距離は同じでも前駆の決定は実装(ヒープや探索順)に依存し、木は一意にならないことがあります。試験問題では通常一意に定まるように設計されていますが、図で複数候補が示される場合は明示的な条件に従って判断します。
関連キーワード: 最短経路木、ダイクストラ、最小全域木、Prim、スパニングツリー、前駆ノード、距離更新、グラフアルゴリズム

\ せっかくなら /
ネットワークスペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

