Union - Find with Python

유건우·2024λ…„ 9μ›” 13일

μ½”ν…Œμ€€λΉ„

λͺ©λ‘ 보기
9/13

πŸ“Œ 문제

문제 : https://www.acmicpc.net/problem/1717

  • μ΄ˆκΈ°μ—Β n+1개의 μ§‘ν•©Β {0},{1},{2}, . . . , {n}이 μžˆλ‹€. 여기에 ν•©μ§‘ν•© μ—°μ‚°κ³Ό, 두 μ›μ†Œκ°€ 같은 집합에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 연산을 μˆ˜ν–‰ν•˜λ €κ³  ν•œλ‹€.
  • 집합을 ν‘œν˜„ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

  • 첫째 쀄에 n, m이 μ£Όμ–΄μ§„λ‹€.Β m은 μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” μ—°μ‚°μ˜ κ°œμˆ˜μ΄λ‹€.
  • λ‹€μŒΒ m개의 μ€„μ—λŠ” 각각의 연산이 μ£Όμ–΄μ§„λ‹€.
  • 합집합은 0Β aΒ b의 ν˜•νƒœλ‘œ μž…λ ₯이 μ£Όμ–΄μ§„λ‹€.
  • μ΄λŠ”Β aκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ§‘ν•©κ³Ό,Β bκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ” 집합을 ν•©μΉœλ‹€λŠ” μ˜λ―Έμ΄λ‹€.
  • 두 μ›μ†Œκ°€ 같은 집합에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 연산은 1Β aΒ b의 ν˜•νƒœλ‘œ μž…λ ₯이 μ£Όμ–΄μ§„λ‹€.
  • μ΄λŠ”Β a와 bκ°€ 같은 집합에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 연산이닀.

좜λ ₯

1둜 μ‹œμž‘ν•˜λŠ” μž…λ ₯에 λŒ€ν•΄μ„œ a, bκ°€ 같은 집합에 ν¬ν•¨λ˜μ–΄μžˆμœΌλ©΄ β€œYes” λ˜λŠ” β€œyes”λ₯Ό, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ β€œNO” λ˜λŠ” β€œno”λ₯Ό ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.




πŸ’‘μœ λ‹ˆμ˜¨νŒŒμΈλ“œ

  • 동적 μ—°κ²° μš”μ†Œ(disjoint-set) 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 νŠΉμ • μš”μ†Œ νŠΉμ • μš”μ†Œλ“€μ΄ 같은 집합에 μ†ν•˜λŠ”μ§€ 효율적으둜 νŒλ³„ν•˜κ±°λ‚˜ 두 집합을 ν•©μΉ˜λŠ” 연산을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Disjoint-set μžλ£Œκ΅¬μ‘°λΌκ³ λ„ 뢈리며, λ„€νŠΈμ›Œν¬ μ—°κ²°, κ·Έλ£Ήν•‘ 문제, 경둜 μ••μΆ• 문제 λ“±μ—μ„œ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.





πŸ§‘β€πŸ’» μ½”λ“œ 풀이

Find - λΆ€λͺ¨ λ…Έλ“œ μ°ΎκΈ°

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x] 
  • μ£Όμ–΄μ§„ μš”μ†Œκ°€ μ†ν•œ μ§‘ν•©μ˜ λŒ€ν‘œ λ…Έλ“œλ₯Ό μ°ΎλŠ” 연산을 ν•©λ‹ˆλ‹€.



Union - μ§‘ν•© ν•©μΉ˜κΈ°

def union_parent(parent, x, y):
    a = find_parent(parent, x)
    b = find_parent(parent, y)

    if a < b:
        parent[b] = a
    else:
        parent[a] = b
  • 두 개의 집합을 ν•˜λ‚˜λ‘œ ν•©μΉ˜λŠ” 연산을 ν•©λ‹ˆλ‹€.



Solution 둜직

def solution(n, m):
    parent = [i for i in range(n + 1)]

    for i in range(m):
        flag, x, y = map(int, sys.stdin.readline().split())

        if flag == 0:
            union_parent(parent, x, y)
        else:
            if find_parent(parent, x) == find_parent(parent, y):
                print('yes')
            else:
                print('no')
  • union-find λ₯Ό μ΄μš©ν•΄ λΆ€λͺ¨κ°€ λ™μΌν•˜λ‹€λ©΄ yesλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
  • λΆ€λͺ¨κ°€ κ°™μ§€ μ•Šλ‹€λ©΄ noλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
profile
βœ…Β μ λ‹Ήν•œ 좔상화λ₯Ό μ°Ύμ•„κ°€λŠ” κ°œλ°œμžμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€