πŸ€–/λ°±μ€€

λ°±μ€€ 1717: μ§‘ν•©μ˜ ν‘œν˜„ (Python)

sssbin 2022. 7. 28. 18:08

 

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

 

1717번: μ§‘ν•©μ˜ ν‘œν˜„

첫째 쀄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 μ£Όμ–΄μ§„λ‹€. m은 μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” μ—°μ‚°μ˜ κ°œμˆ˜μ΄λ‹€. λ‹€μŒ m개의 μ€„μ—λŠ” 각각의 연산이 μ£Όμ–΄μ§„λ‹€. 합집합은 0 a b의 ν˜•νƒœλ‘œ μž…λ ₯이 μ£Όμ–΄μ§„λ‹€. μ΄λŠ”

www.acmicpc.net

 

μ΄μ½”ν…Œμ—μ„œ ν’€μ—ˆλ˜ 문제 κ·ΈλŒ€λ‘œ λ‚˜μ™”λ‹€.

https://sssbin.tistory.com/193

κ·Έλž˜μ„œ μ•Œκ³ λ¦¬μ¦˜ λ‹€μ‹œ μ •λ¦¬ν•œλ‹€λŠ” 마음으둜 λ‚΄ μ†μœΌλ‘œ 직접 ν’€μ—ˆμ§€λ§Œ ,, μ‹œκ°„ 초과둜 μ‹€νŒ¨

 

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


n, m = map(int, input().split())

parent = [0] * (n+1)
for i in range(1, n+1):
    parent[i] = i

for _ in range(m):
    c, a, b = map(int, input().split())

    if c == 0: # ν•©μ§‘ν•©
        union_parent(parent, a, b)
    else: # 같은 집합인지 확인
        if find_parent(parent, a) == find_parent(parent, b):
            print("YES")
        else:
            print("NO")

 

μž…λ ₯ 값이 λ§ŽμœΌλ‹ˆκΉŒ (1 ≤ m ≤ 100,000)

μ‹œμŠ€ν…œ μž…μΆœλ ₯을 μ΄μš©ν•΄μ„œ 값을 μž…λ ₯받도둝 λ°”κΏ¨λŠ”λ° (μ•„λž˜ μ½”λ“œ μΆ”κ°€)

import sys
input = sys.stdin.readline

μž¬κ·€ λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€.

 

νŒŒμ΄μ¬μ—μ„œ μž¬κ·€λ₯Ό μ‚¬μš©ν•˜λŠ” λ¬Έμ œλŠ” 기본으둜 μ„€μ •λ˜μ–΄ μžˆλŠ” μž¬κ·€ κΉŠμ΄κ°€ μž‘μ•„μ„œ μž¬κ·€ 깊이 μ œν•œμ„ ν’€μ–΄μ€˜μ•Ό ν•œλ‹€κ³  함,,

그리고 λ‹€μ‹œ λ‚΄ μ½”λ“œλž‘ 문제λ₯Ό μ‚΄νŽ΄λ³΄λ‹€κ°€ λ†“μΉœ 뢀뢄을 λ°œκ²¬ν–ˆλ‹€.

μ΄ˆκΈ°μ— {0}, {1}, {2}, ... {n} 이 각각 n+1개의 집합을 이루고 μžˆλ‹€.

parent 리슀트 μ΄ˆκΈ°ν™”λ₯Ό 인덱슀 1λΆ€ν„° ν•΄μ€¬λŠ”λ° μˆ«μžκ°€ 0λΆ€ν„° μ‹œμž‘.!!!! κ·Έλž˜μ„œ μž¬κ·€ μ œν•œ 늘렀주고 (n의 μ΅œλŒ€ λ²”μœ„λ‘œ μ„€μ •) 리슀트 μ΄ˆκΈ°ν™” λΆ€λΆ„ 반볡문 λ²”μœ„λ₯Ό 바꿔쀬닀.

 

# μΆ”κ°€
sys.setrecursionlimit(1000000)
# μˆ˜μ •
parent = [0] * (n+1)
for i in range(n+1):
    parent[i] = i

 

λ“œλ””μ–΄ μ •.λ‹΅. πŸ˜₯

<μ΅œμ’… μ½”λ“œ>

import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline

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


n, m = map(int, input().split())

parent = [0] * (n+1)
for i in range(n+1):
    parent[i] = i

for _ in range(m):
    c, a, b = map(int, input().split())

    if c == 0: # ν•©μ§‘ν•©
        union_parent(parent, a, b)
    else: # 같은 집합인지 확인
        if find_parent(parent, a) == find_parent(parent, b):
            print("YES")
        else:
            print("NO")