跳到主要内容

名古屋大学 情報学研究科 複雑系科学専攻 2024年8月実施 情3

Author

祭音Myyura

Description

[1]

Union/Find とは、互いに素な集合の集まりを管理するデータ構造で以下の 2 つの操作をもつ。 その集合で最小の要素を代表の要素とする。

  • Find(x):x が所属する集合の代表の要素を返す操作。 要素 x のみの集合は、代表の要素は x となる。
  • Union(x, y):x が所属する集合と y が所属する集合を 1 つにまとめる操作。

例えば初期状態が {0}, {1}, {2}, {3}, {4} の場合、 Find(3) を実行すると 3 が返され、 Union(1, 3) を実行すると、{0}, {1, 3}, {2}, {4} となる。

1)

初期集合が

{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}

であるとする。この集合に対して以下のような順で Union 操作を行う過程を示しなさい。

Union(0, 2)
Union(1, 5)
Union(3, 4)
Union(6, 9)
Union(0, 8)
Union(3, 7)
Union(1, 6)

2)

  1. で得られた最終的な集合に対して、Find(2), Find(4), Find(6) の操作を行った結果を示しなさい。

[2]

Union/Find 操作を用いて頂点が {0,1,2,...,5}\{0, 1, 2, ..., 5\} である無向グラフ GG に閉路が存在するかどうか調べる。 Union/Find 操作による閉路検出では、各ノードを単一要素の集合に初期化し、 辺の両端ノードの Find 操作で所属集合を調べる。 もし同じ集合なら閉路であることが検出され、 異なる集合なら Union 操作を行う。 この処理を各辺について繰り返す。 GG は以下の隣接リストで表す。 このリストは、頂点 00 から 55 のそれぞれについて、 隣接するすべての頂点を列挙したものである。 閉路検出に用いた Union/Find 操作の内容を操作順に示せ。

GG の隣接リスト

頂点隣接頂点
04
12, 5
21, 5
35
42
51, 2, 3

[3]

クラスカル法は、重み付き無向グラフの最小全域木(Minimum Spanning Tree, MST)を探索するアルゴリズムである。 最小全域木とは重み付き無向グラフの部分木であり、 しかも、そのグラフのすべての頂点を含み、 構成するすべての辺の重みの合計が最小のものである。 クラスカル法の手順を以下に示す。

  1. 初期状態を空のグラフ GG とする。
  2. 与えられたグラフ MM の全ての辺を重みの小さい順に並べ替え、辺リスト LL とする。
  3. 辺リスト LL から順に辺 ee を取り出し、LL が空になるまで以下を行う。
    1. ee をグラフ GG に追加した場合に閉路ができるかを Union/Find 操作で判定する。閉路ができない場合、辺 ee をグラフ GG に追加し、Union 操作を行う。

以下の NN は 7 つの頂点 (1,2,3,...,7)(1, 2, 3, ..., 7) で構成される重み付き無向グラフである。NN の辺と重みは次のように表記される。

辺の両端点重み
(1, 2)2
(1, 3)3
(1, 7)4
(2, 3)5
(2, 5)7
(3, 4)9
(3, 6)8
(4, 6)10
(5, 6)6
(5, 7)1

クラスカル法を使って、実行された Union/Find 操作の処理内容も含めて、グラフ NN の最小全域木(MST)を求める過程を示しなさい。

Kai

[1]

1)

操作操作後の集合
Union(0, 2){0,2}, {1}, {3}, {4}, {5}, {6}, {7}, {8}, {9}
Union(1, 5){0,2}, {1,5}, {3}, {4}, {6}, {7}, {8}, {9}
Union(3, 4){0,2}, {1,5}, {3,4}, {6}, {7}, {8}, {9}
Union(6, 9){0,2}, {1,5}, {3,4}, {6,9}, {7}, {8}
Union(0, 8){0,2,8}, {1,5}, {3,4}, {6,9}, {7}
Union(3, 7){0,2,8}, {1,5}, {3,4,7}, {6,9}
Union(1, 6){0,2,8}, {1,5,6,9}, {3,4,7}

2)

Find(2)=0,Find(4)=3,Find(6)=1\operatorname{Find}(2)=0, \operatorname{Find}(4)=3, \operatorname{Find}(6)=1

[2]

無向辺は重複を除き、隣接リストに現れる順に

(0,4),(1,2),(1,5),(2,5),(3,5),(2,4)(0,4),(1,2),(1,5),(2,5),(3,5),(2,4)

として処理する。

Find の結果処理
(0,4)Find(0)=0, Find(4)=4異なるので Union(0,4)
(1,2)Find(1)=1, Find(2)=2異なるので Union(1,2)
(1,5)Find(1)=1, Find(5)=5異なるので Union(1,5)
(2,5)Find(2)=1, Find(5)=1同じ集合なので閉路を検出
(3,5)Find(3)=3, Find(5)=1異なるので Union(3,5)
(2,4)Find(2)=1, Find(4)=0異なるので Union(2,4)

(2,5) を調べた時点で、頂点 2 と 5 はすでに同じ集合に属している。
したがって、この辺を加えると

12511-2-5-1

という閉路ができる。

[3]

辺を重みの小さい順に並べると、

(5,7):1, (1,2):2, (1,3):3, (1,7):4, (2,3):5,(5,6):6, (2,5):7, (3,6):8, (3,4):9, (4,6):10\begin{aligned} &(5,7):1,\ (1,2):2,\ (1,3):3,\ (1,7):4,\ (2,3):5,\\ &(5,6):6,\ (2,5):7,\ (3,6):8,\ (3,4):9,\ (4,6):10 \end{aligned}

となる。

辺・重みFind の結果判定
(5,7), 15 \neq 7採用し、Union(5,7)
(1,2), 21 \neq 2採用し、Union(1,2)
(1,3), 31 \neq 3採用し、Union(1,3)
(1,7), 41 \neq 5採用し、Union(1,7)
(2,3), 51 = 1閉路ができるため不採用
(5,6), 61 \neq 6採用し、Union(5,6)
(2,5), 71 = 1閉路ができるため不採用
(3,6), 81 = 1閉路ができるため不採用
(3,4), 91 \neq 4採用し、Union(3,4)

7 頂点の全域木に必要な辺数は 71=67-1=6 本であるため、ここで終了する。

採用された辺は

(5,7),(1,2),(1,3),(1,7),(5,6),(3,4)\boxed{ (5,7),(1,2),(1,3),(1,7),(5,6),(3,4) }

である。

重みの合計は

1+2+3+4+6+9=251+2+3+4+6+9=25