[Algorithm]無方向図周期の決定(相互集合)


グラフィックでループを判別する


ノンダイレクトマップにおけるループ判別:シーケンスセット(disjoint set)
方向図でのループの決定:DFS
本稿では,無方向図におけるcycle判別について論じる.

無方向図におけるサイクル判別


集合演算は図中のedgeとして表すことができる
したがって、ループを識別するには、2つのノードを含むセットを次々とチェックします.

無方向図中の循環判別アルゴリズム:

  • のコーナーエッジを確認し、2つのノードのルートノードを確認します.
  • 本のノードが異なる場合、2つのノードに対して集約演算
  • を実行する.
  • 本のノードが等しい場合、ループ
  • が発生する.
  • 図に含むすべてのエッジについて、プロセス
  • を繰り返す.

    ソースコードの例

    # 이코테 p.279 서로소 집합을 활용한 사이클 판별 소스코드
    def find_parent(parent, x):
        if parent[x] != x:
            parent[x] = find_parent(parent, parent[x])
        return parent[x]
    
    def union_parent(parent, a, b):
        a = find_parent(parent, a)
        b = find_parent(parent, b)
        if a < b:
            parent[b] = a
        else:
            parent[a] = b
    
    v, e = map(int, input().split())
    parent = [0] * (v + 1)
    
    for i in range(1, v + 1):
        parent[i] = i
    
    cycle = False
    
    for i in range(e):
        a, b = map(int, input().split())
    
        if find_parent(parent, a) == find_parent(parent, b):
            cycle = True
            break
        else:
            union_parent(parent, a, b)
    
    if cycle:
        print('Cycle occurrence')
    else:
        print('No cycle occurred')