アルゴリズムとプログラミング

基本情報技術者試験グラフ」の問題

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:normal
6 個のノード(番号 1〜6)からなる有向グラフを次の辺リストで与える(u → v は u から v への辺)。 1→2, 1→3, 2→4, 3→4, 2→5, 4→6 出次数(そのノードから出ていく辺の本数)が 0 のノード、すなわち他のどのノードへも辺を持たない終端ノードの個数を求める。次の擬似言語を実行したとき返り値 sinks はどれか。
○関数: countSinks(): 整数型
  整数型の配列: outdeg ← {0, 0, 0, 0, 0, 0}
  各辺 u→v について
    outdeg[u] ← outdeg[u] + 1
  整数型: i, sinks ← 0
  for (i を 1 から 6 まで 1 ずつ増やす)
    if (outdeg[i] = 0)
      sinks ← sinks + 1
    endif
  endfor
  return sinks
4 個
1 個
2 個
3 個
正解
2 個

辺の始点 u を数えると出次数は 1→2本, 2→2本, 3→1本, 4→1本, 5→0本, 6→0本。outdeg={2,2,1,1,0,0} のうち 0 はノード5 とノード6 の 2 個なので sinks=2、すなわち ウが正しい。

?選択肢ごとの解説

ア ×4 個は出次数が 0 でないノードまで数え込んだ過大計上であり、終端の判定を誤った結果である。
イ ×1 個はノード5・6 のどちらか一方だけを数え、もう一方を見落とした計上漏れの誤りである。
ウ ○辺の始点 u を数えると出次数は 1→2本, 2→2本, 3→1本, 4→1本, 5→0本, 6→0本。outdeg={2,2,1,1,0,0} のうち 0 はノード5 とノード6 の 2 個なので sinks=2、すなわち ウが正しい。
エ ×3 個は出次数 1 のノード(3 や 4)を終端に含めてしまうなど、0 以外を数えた誤りである。

くわしく

出次数は『辺の始点 u』を数えることで求まる。出次数 0 のノードはグラフの終端(シンク)であり、処理の最終段やこれ以上たどれない地点を表す。入次数とは数える側が逆である点に注意する。

本番での押さえどころ

試験のコツ

出次数は矢印の『元』の本数。各ノードから出る矢を数え、本数が 0 のノードだけを数え上げる。

覚え方

『出口のないノードが終端』と覚える。

よくある誤り

始点と終点を取り違えて入次数を数える、0 以外のノードも終端に含めてしまうミスが多い。

アルゴリズムとプログラミングの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0155

【基本情報技術者試験】グラフの問題 — 解答・解説|ukamiru 過去問