πŸ€–/λ°±μ€€

λ°±μ€€ 1976: μ—¬ν–‰ κ°€μž (Python)

sssbin 2022. 7. 28. 20:19

 

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

 

1976번: μ—¬ν–‰ κ°€μž

λ™ν˜μ΄λŠ” μΉœκ΅¬λ“€κ³Ό ν•¨κ»˜ 여행을 κ°€λ €κ³  ν•œλ‹€. ν•œκ΅­μ—λŠ” λ„μ‹œκ°€ N개 있고 μž„μ˜μ˜ 두 λ„μ‹œ 사이에 길이 μžˆμ„ μˆ˜λ„, 없을 μˆ˜λ„ μžˆλ‹€. λ™ν˜μ΄μ˜ μ—¬ν–‰ 일정이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 μ—¬ν–‰ κ²½λ‘œκ°€ κ°€λŠ₯ν•œ 것인

www.acmicpc.net

 

문제의 해결법은 μ‰½κ²Œ 생각해낼 수 μžˆμ—ˆλ‹€.

μž…λ ₯된 μ—¬ν–‰ κ³„νšμ˜ λ„μ‹œλ“€μ΄ μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€λ§Œ ν™•μΈν•˜λ©΄ λœλ‹€.

 

λ„μ‹œλ“€μ˜ μ—°κ²° 정보λ₯Ό μž…λ ₯받을 λ•Œ 1이면 unionν•΄μ€€λ‹€.

 

κ³„νšμ„ μž…λ ₯받은 ν›„ μ‹œκ°„μ„ 쀄이기 μœ„ν•΄ λ¦¬μŠ€νŠΈμ—μ„œ 쀑볡 μ›μ†Œλ₯Ό μ œκ±°ν•΄μ£Όκ³ 

findλ₯Ό 톡해 λͺ¨λ‘ 같은 λΆ€λͺ¨λ₯Ό 가지고 μžˆλŠ”μ§€(= ν•˜λ‚˜μ˜ 집합인지) 확인해주면 λœλ‹€.

 

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 = int(input())
m = int(input())

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

cities = []
for i in range(n):
    cities.append(list(map(int, input().split())))
    for j in range(n):
        if cities[i][j] == 1:
            union_parent(parent, i+1, j+1)


plan = list(map(int, input().split()))
plan_set = set(plan) # 쀑볡 제거

check = find_parent(parent, plan[0])
for i in plan_set:
    if find_parent(parent, i) != check:
        print("NO")
        exit(0)
print("YES")