λ¬Έμ
μ§μ€μ μκ³ μλ μ¬λμ΄ νν°μ μ€λ κ²½μ°, μ§μ€μ μκ³ μλ μ¬λκ³Ό κ°μ νν°μ μλ μ¬λμ΄ λ€λ₯Έ νν°μ μ€λ κ²½μ°, κ±°κΈ°μ μλ λ€λ₯Έ μ¬λμ΄ μ°Έμνλ λ λ€λ₯Έ νν°μ κ²½μ° λ±μ΄ μ‘΄μ¬νλ μν©μμ μ§λ―Όμ΄κ° κ³Όμ₯λ μ΄μΌκΈ°λ₯Ό ν μ μλ νν° μμ μ΅λκ°μ ꡬνλ λ¬Έμ .
λ¬Έμ νμ΄
Union-Find μκ³ λ¦¬μ¦μΌλ‘ νμ΄
μ§λ―Όμ΄κ° κ³Όμ₯λ μ΄μΌκΈ°λ₯Ό ν μ μλ μ¬λλ€μ νλμ μ§ν©μΌλ‘ ꡬμ±
ffind ν¨μλ‘ ν΄λΉ μμμ parent μμλ₯Ό μ°Ύλλ€.
union ν¨μλ‘ μ§μ€μ μλ μ¬λλ€κ³Ό κ·Έμ κ°μ΄ νν°μ μ€λ μ¬λλ€(μ°μμ )μ νλλ‘ λ¬Άλλ€.
- μ λ ₯λ°μ λ μμκ° λͺ¨λ μ§μ€μ μλ μ¬λ -> λ³ν X
- λ μ€ ν μμκ° μ§μ€μ μλ μ¬λ -> μ§μ€μ μλ μ¬λμ λΆλͺ¨λ‘ κ°±μ
- λ λ€ μ§μ€μ μλ μ¬λμ΄ μλ -> λμ κ΄κ³μ λ°λΌ λΆλͺ¨ κ΄κ³ λΆμ¬ (νμ κ°±μ λ μ μμΌλ―λ‘)
μ½λ
import sys
input=sys.stdin.readline
def find(parent,x):
if x!=parent[x]:
parent[x]=find(parent,parent[x])
return parent[x]
def union(parent,a,b,mem):
a=find(parent,a)
b=find(parent,b)
if a in mem and b in mem:
return
if a in mem:
parent[b]=a
elif b in mem:
parent[a]=b
else:
if a<b:
parent[b]=a
else:
parent[a]=b
n,m=map(int,input().split())
b=list(map(int,input().split()))[1:]
##μλ μ¬λ
g=[]
parent=list(range(n+1))
for i in range(m):
temp=list(map(int,input().split()))
people=temp[1:]
for j in range(temp[0]-1):
union(parent,people[j],people[j+1],b)
g.append(temp[1:])
result=0
for i in g:
for j in range(len(i)):
if find(parent,i[j]) in b:
break
else:
result+=1
print(result)
κΈ°ν
λ§μ½ μ§ν©μ μ΄μ©νμ¬ νΌλ€λ©΄ μμ°¨μ μΌλ‘ νμνλ κ²½μ°, νμ μλ‘κ² νλλ‘ λ¬Άμ΄κ² λλ κ²½μ°κ° λ°μν μ μμ΄μ λ€μ λͺ¨λ νν°λ₯Ό μ¬νμν΄μΌνλ―λ‘ λͺ¨λ κ²½μ°λ₯Ό νμν μ μμ΄μΌνλ€. (κ·Έμ λ°λ₯Έ μλ‘μ΄ κ²½μ°κ° λ°μ μ λ λ€μ νμ)
->μκ° μ΄κ³Όμ κ±Έλ¦¬μ§ μλλ‘ μ£Όμ
'π» μκ³ λ¦¬μ¦ > PS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ/λ°±μ€] 14907 νλ‘μ νΈ μ€μΌμ€λ§ - νμ΄μ¬ (2) | 2023.11.29 |
---|---|
[BOJ/λ°±μ€] 9742 μμ΄ - νμ΄μ¬ (0) | 2022.05.11 |
[BOJ/λ°±μ€] 2160 κ·Έλ¦ΌλΉκ΅ - νμ΄μ¬ (0) | 2022.05.11 |
[λ°±μ€/BOJ] 1449 μ리곡 νμΉ - νμ΄μ¬ (0) | 2022.05.08 |
[2017 μΉ΄μΉ΄μ€μ½λ μμ ] 컬λ¬λ§λΆ - νμ΄μ¬ (0) | 2022.03.16 |