東北大学 工学研究科 電気・情報系 2023年2・3月実施実施 基礎科目 問題4 情報基礎2
Author
祭音Myyura
Description
以下の問に答えよ。
(1)
節点の集合 V V V と重みが付いた枝の集合 E E E からなる連結無向グラフ G = ( V , E ) G = (V, E) G = ( V , E ) について考える.
Fig. 4 のグラフ G 1 G_1 G 1 はそのような連結無向グラフの例であり、各枝の中央付近に記載の整数は、その枝の重みである。
(a) Fig. 4 のグラフ G 1 G_1 G 1 の隣接行列と隣接リストを示せ、ただし、枝の重みの情報は含まなくても良い。
(b) n n n 個の節点と m m m 個の枝からなるグラフ G G G の隣接行列と隣接リストを格納するのに必要な記憶領域のサイズを O O O 記法でそれぞれ示せ。
(c) グラフ G G G の連結部分グラフの中で、G G G の全ての節点を含む木を G G G の全域木と呼ぶ、また、G G G の全域木の中で、枝の重みの合計が最小であるものを G G G の最小全域木と呼ぶ. Fig. 4のグラフ G 1 G_1 G 1 の最小全域木を示せ.
(2)
各行の要素の値は左から右に昇順ソートされ、かつ、各列の要素の値は上から下に昇順ソートされている n n n 行 m m m 列の整数行列 M M M を考える、任意の整数 x x x に対して、M M M に値が x x x である要素が含まれる場合は「Yes」 を出力し、そうでない場合は「No」を出力する探索アルゴリズムを考える、時間計算量が O ( n + m ) O(n + m) O ( n + m ) となるような探索アルゴリズムの概要を説明せよ。
Kai
(1)
(a)
隣接行列
( 0 6 7 0 0 6 0 5 3 2 7 5 0 1 0 0 3 1 0 4 0 2 0 4 0 ) \begin{pmatrix}
0 & 6 & 7 & 0 & 0 \\
6 & 0 & 5 & 3 & 2 \\
7 & 5 & 0 & 1 & 0 \\
0 & 3 & 1 & 0 & 4 \\
0 & 2 & 0 & 4 & 0
\end{pmatrix} 0 6 7 0 0 6 0 5 3 2 7 5 0 1 0 0 3 1 0 4 0 2 0 4 0
隣接リスト
a : ( b , 6 ) , ( c , 7 ) b : ( a , 6 ) , ( c , 5 ) , ( d , 3 ) , ( e , 2 ) c : ( a , 7 ) , ( b , 5 ) , ( d , 1 ) d : ( b , 3 ) , ( c , 1 ) , ( e , 4 ) e : ( b , 2 ) , ( d , 4 ) \begin{aligned}
a & : (b, 6), (c, 7) \\
b & : (a, 6), (c, 5), (d, 3), (e, 2) \\
c & : (a, 7), (b, 5), (d, 1) \\
d & : (b, 3), (c, 1), (e, 4) \\
e & : (b, 2), (d, 4)
\end{aligned} a b c d e : ( b , 6 ) , ( c , 7 ) : ( a , 6 ) , ( c , 5 ) , ( d , 3 ) , ( e , 2 ) : ( a , 7 ) , ( b , 5 ) , ( d , 1 ) : ( b , 3 ) , ( c , 1 ) , ( e , 4 ) : ( b , 2 ) , ( d , 4 )
(b)
隣接行列は n × n n \times n n × n の行列で、各要素に辺の重み(整数)を格納するため、メモリ使用量は O ( n 2 ) O(n^2) O ( n 2 ) となります。
隣接リストは各ノードに接続されているノードとその重みをリストで保持します。全辺数 m m m を考えると、メモリ使用量は O ( n + m ) O(n + m) O ( n + m ) です。
(c)
クラスカル法では以下の辺が選ばれることになります。
( c , d ) (c, d) ( c , d ) 重み 1
( b , e ) (b, e) ( b , e ) 重み 2
( b , d ) (b, d) ( b , d ) 重み 3
( a , b ) (a, b) ( a , b ) 重み 6
これで、最小全域木の重みの合計は 1 + 2 + 3 + 6 = 12 1 + 2 + 3 + 6 = 12 1 + 2 + 3 + 6 = 12 です。
(2)
アルゴリズム概要
右上から開始する。ここでは右上 ( i , j ) = ( 0 , m − 1 ) (i,j)=(0,m-1) ( i , j ) = ( 0 , m − 1 ) とする。
ループ:
もし M [ i ] [ j ] = x M[i][j]=x M [ i ] [ j ] = x なら「Yes」を返す(終了)。
もし M [ i ] [ j ] > x M[i][j] > x M [ i ] [ j ] > x なら、この列の下方向はすべて M [ i ] [ j ] M[i][j] M [ i ] [ j ] 以上なので、列を1つ左へ 移動(j ← j − 1 j \leftarrow j-1 j ← j − 1 )。
もし M [ i ] [ j ] < x M[i][j] < x M [ i ] [ j ] < x なら、この行の左方向はすべて M [ i ] [ j ] M[i][j] M [ i ] [ j ] 以下なので、行を1つ下へ 移動(i ← i + 1 i \leftarrow i+1 i ← i + 1 )。
インデックスが範囲外になったら要素は存在しないので「No」。
計算量
行インデックス i i i は最大 n n n 回増え,列インデックス j j j は最大 m m m 回減る。したがって比較回数は高々 n + m n+m n + m ,時間計算量は O ( n + m ) O(n+m) O ( n + m ) 。