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

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

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:normal
有向グラフを次の辺リストで与える(u → v は u から v への辺)。 1→2, 1→3, 2→4, 5→1 次の手続 reachCount は、始点 s から有向辺をたどって到達できるノードの総数(s 自身を含む)を返す。スタックを用いた深さ優先で探索する。reachCount(1) を実行したとき、戻り値はどれか。
○整数型: reachCount(整数型: s)
  stack ← 空のスタック
  visited[s] ← true
  push(s)
  整数型: cnt ← 1
  while (stack が空でない)
    整数型: u ← pop()
    整数型: v
    for (v を 1 から 5 まで 1 ずつ増やす)
      if (辺 u→v が存在 かつ visited[v] が false)
        visited[v] ← true
        cnt ← cnt + 1
        push(v)
      endif
    endfor
  endwhile
  return cnt
到達 4 個
全 5 個
始点のみ 1 個
2 個
正解
到達 4 個

1 から有向辺をたどると 2,3 へ、さらに 2 から 4 へ到達する。到達集合は {1,2,3,4} の 4 個であり、5 は 1 へ向かう辺しか持たず到達できないため、cnt=4 となり アが正しい。

?選択肢ごとの解説

ア ○1 から有向辺をたどると 2,3 へ、さらに 2 から 4 へ到達する。到達集合は {1,2,3,4} の 4 個であり、5 は 1 へ向かう辺しか持たず到達できないため、cnt=4 となり アが正しい。
イ ×全ノード数 5 をそのまま答えた、有向辺の向きを無視して 5→1 を逆向きにたどれると誤認した誤りである。
ウ ×始点 1 だけを数えて隣接ノードへの探索を行わなかった、ループ未実行の誤りである。
エ ×1 の直接の隣接 2,3 のうち 1 つ分しか進めず 2 個とした、間接到達 4 と分岐を取りこぼした誤りである。

くわしく

有向グラフの到達可能性は辺の向きに厳密に従う。入ってくる辺(5→1)は始点からの到達には寄与せず、出ていく辺だけをたどる点が無向グラフとの違いである。

本番での押さえどころ

試験のコツ

矢印の向きに沿ってのみ進み、始点へ入る辺は探索に使わないことを徹底する。

覚え方

『有向は一方通行、向きに逆らわない』と覚える。

よくある誤り

有向辺を無向と勘違いし、5→1 を逆にたどって 5 まで数えるミスが多い。

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

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

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

無料ではじめる →

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

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