ITの基礎知識|ITパスポート・基本情報

基本情報技術者 令和6年公開問題 科目B 問3

2026.07.08

科目Bに共通する注意事項(表記ルールなど)については、下記のリンク先を参照してください。

基本情報技術者 令和6年公開問題 科目Bの注意事項


問題

次のプログラム中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1 から始まる。

図1 に示すグラフの頂点には,1 から順に整数で番号が付けられている。グラフは 無向グラフであり,各頂点間には高々一つの辺がある。一つの辺は両端の頂点の番号 を要素にもつ要素数2 の整数型の 配列で表現できる。例えば,{1,3} は頂点1 と頂 点3 を端点とする辺を表す。グラフ全体は,グラフに含まれる辺を表す要素数2 の配 列を全て格納した配列(以下,辺の配列という)で表現できる。辺の配列の要素数は グラフの辺の個数と等しい。図1 のグラフは整数型配列の配列{{1, 3}, {1, 4}, {3, 4}, {2, 4}, {4, 5}}と表現できる。

図1 グラフの例

関数edgesToMatrix は,辺の配列を隣接行列に変換する。隣接行列とは,グラフに 含まれる頂点の個数と等しい行数及び列数の正方行列で,i 行j 列の成分は頂点i と 頂点j を結ぶ辺があるときに1 となり,それ以外は0 となる。行列の対角成分は全て 0 で,無向グラフの場合は対称行列になる。図1 のグラフを表現する隣接行列を図2 に示す。

図2 図1 のグラフを表現する隣接行列

関数edgesToMatrix は,引数edgeList で辺の配列を,引数nodeNum でグラフの頂 点の個数をそれぞれ受け取り,隣接行列を表す整数型の二次元配列を返す。

[プログラム]

○整数型の二次元配列: edgesToMatrix(整数型配列の配列: edgeList,
整数型: nodeNum)
  整数型の二次元配列: adjMatrix ← {nodeNum行nodeNum列の 0}
  整数型: i, u, v
  for (i を 1 から edgeListの要素数 まで 1 ずつ増やす)
    u ← edgeList[i][1]
    v ← edgeList[i][2]
    [__空欄__]
  endfor
  return adjMatrix

 

解答群

  • ア adjMatrix[u, u] ← 1
  • イ adjMatrix[u, u] ← 1 / adjMatrix[v, v] ← 1
  • ウ adjMatrix[u, v] ← 1
  • エ adjMatrix[u, v] ← 1 / adjMatrix[v, u] ← 1
  • オ adjMatrix[v, u] ← 1
  • カ adjMatrix[v, v] ← 1

Show answer

解答

解説

ループの各回では,辺 {u, v}(頂点 u と頂点 v を結ぶ辺)を 1 本取り出しています。この辺を隣接行列に反映するには,行列のどの成分を 1 にすればよいかを考えます。

ポイントは,このグラフが無向グラフであることです。無向グラフでは「u と v を結ぶ辺」は「u から v」と「v から u」の両方向の関係を意味するので,

  • u 行 v 列(adjMatrix[u, v])
  • v 行 u 列(adjMatrix[v, u])

両方を 1 にする必要があります。問題文にも「無向グラフの場合は対称行列になる」とあるとおりです。よってが正解です。

他の選択肢を確認します。

  • ア・イ・カ:adjMatrix[u, u] や adjMatrix[v, v] は対角成分です。問題文に「対角成分は全て 0」とあるとおり,自分自身への辺(自己ループ)は存在しないため誤りです。
  • ウ:adjMatrix[u, v] だけでは片方向しか記録されず,対称行列になりません。例えば辺 {1, 3} に対して 1 行 3 列だけが 1 になり,3 行 1 列が 0 のままなので,図 2 の隣接行列と一致しません。
  • オ:ウと同様に片方向だけの記録であり誤りです。

なお,有向グラフであればウ(またはオ)のように片方向だけ 1 にする実装になります。「無向=対称に2か所」「有向=1か所」という対応を押さえておくと,グラフ問題で迷いません。