問3 辺の配列から隣接行列を作る

基本情報​技術者試験 令和6年度 公開問題 科目B、全6問のうちの問3。

出典:令和6年度 基本情報技術者試験 公開問題 科目B 問3(図 1 のグラフの絵は、問題文の辺の配列に合わせて、辺ごとの両端の頂点の表に書き起こした。図 2 の行列は表に書き起こし、行と列の番号を足した。プログラムは原本の画像を文字に書き起こし、字下げは 1 段を空白 2 つで表した。関数の宣言の 2 行目は、原本どおり引数の位置にそろえた。空欄は[  ]で表した。2 行から成る選択肢 (イとエ) は、2 つの文を「,」で並べて 1 行にした)

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

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

図1 グラフの例 (辺の一覧に書き起こした。頂点は 1〜5)
辺一方の頂点もう一方の頂点
{1, 3}13
{1, 4}14
{3, 4}34
{2, 4}24
{4, 5}45

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

図2 図 1 のグラフを表現する隣接行列
行\列12345
100110
200010
310010
411101
500010

関数 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
  1. アadjMatrix[u, u] ← 1
  2. イadjMatrix[u, u] ← 1,adjMatrix[v, v] ← 1 の 2 行
  3. ウadjMatrix[u, v] ← 1
  4. エadjMatrix[u, v] ← 1,adjMatrix[v, u] ← 1 の 2 行
  5. オadjMatrix[v, u] ← 1
  6. カadjMatrix[v, v] ← 1
答えと解説を開く

正解はエです。

隣接行列の i 行 j 列は「頂点 i と頂点 j を結ぶ辺があるか」です。無向グラフでは、頂点 u と v を結ぶ辺は、u 行 v 列から見ても v 行 u 列から見ても同じ辺なので、両方を 1 にします。だから対称行列になります。辺の配列を前から順に追います。{1, 3} で [1, 3] と [3, 1] を 1 にします。{1, 4} で [1, 4] と [4, 1]、{3, 4} で [3, 4] と [4, 3]、{2, 4} で [2, 4] と [4, 2]、{4, 5} で [4, 5] と [5, 4] を 1 にします。1 行目は 3 列目と 4 列目が 1 で {0, 0, 1, 1, 0}、4 行目は 1、2、3、5 列目が 1 で {1, 1, 1, 0, 1} になり、図 2 と合います。対角成分は一度も書かないので 0 のままです。正解はエです。

ほかの選択肢が違う理由

  • ア対角成分の u 行 u 列を 1 にしています。隣接行列の対角成分は全て 0 で、辺の相手の v が行列に現れません。
  • イ対角成分の u 行 u 列と v 行 v 列を 1 にしています。頂点どうしのつながりが記録されません。
  • ウu 行 v 列だけを 1 にしています。この例の辺はどれも u < v なので右上の半分しか埋まらず、たとえば 3 行 1 列が 0 のままで、図 2 の対称行列になりません。
  • オv 行 u 列だけを 1 にしています。この例では左下の半分しか埋まらず、たとえば 1 行 3 列が 0 のままです。
  • カ対角成分の v 行 v 列を 1 にしています。隣接行列の対角成分は全て 0 です。

仕組み

グラフの持ち方には、辺を並べる辺の配列 (辺リスト) と、頂点の組ごとに 0 と 1 を並べる隣接行列があります。隣接行列は 2 つの頂点がつながっているかをすぐ調べられますが、頂点が多いと場所を多く使います。

無向グラフでは辺に向きが無いので、隣接行列は対角線をはさんで左右対称になります。向きのある有向グラフなら、u から v への辺は u 行 v 列だけを 1 にします。

この問に出る言葉