0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnionFind木の考え方

Posted at

はじめに

基本的なアルゴリズムの一つであるUnionFind木についてまとめました。

UnionFind木とは?

UnionFind木とは無向グラフのノードのとエッジの情報から、どのノード同士が連結していてたどることができるかどうかを判定するアルゴリズムです。

UnionFind木のデータ構造

UnionFind木ではリストでデータを保存します。
親となるノードは-1で表し、子となるノードでは親のノード番号を指します。
例えば、5つのノードがあったとして、エッジの情報が与えられてない場合

[-1,-1,-1,-1,-1]

のような形で表すことができます。
ここでノード1とノード2が連結しているということを表したいときは、

[-2,0,-1,-1,-1]

のような形で表現できます。
無向グラフであるため明確にどちらが親というのは決まっていないため、ノード番号が若いときを親として表現します。
またノード1は-2となっていますが、親は子を新しく持った時に-1を行います。そうすることで、連結しているノードの数を表現しています。

推移的に連結している時

先ほどのグラフから新たにノード2とノード3が連結したとします。
その場合、1,2,3のノードが連結しています
この情報は

[-2,0,0,-1,-1]

このように表現できます。ノード3は直接依存しているノード2ではなくてさらにその親ノードであるノード1を指します。

Pythonの実装例

以下がPythonでの実装例です。

UnionFind.py
class UnionFind:
    def __init__(self,n):
        self.list=[-1]*n

    def find(self,index):
        while self.list[index]>=0:
            index=self.list[index]
        return index
    
    def union(self,a,b):
        x=self.find(a)
        y=self.find(b)

        if x>y:
            x,y=y,x
        
        self.list[x]+=self.list[y]
        self.list[y]=x
    
    def group_num(self):
        group=0
        for i in self.list:
            if i<0:
                group+=1
        return group
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?