https://www.acmicpc.net/problem/1717
1717๋ฒ: ์งํฉ์ ํํ
์ด๊ธฐ์ $n+1$๊ฐ์ ์งํฉ $\{0\}, \{1\}, \{2\}, \dots , \{n\}$์ด ์๋ค. ์ฌ๊ธฐ์ ํฉ์งํฉ ์ฐ์ฐ๊ณผ, ๋ ์์๊ฐ ๊ฐ์ ์งํฉ์ ํฌํจ๋์ด ์๋์ง๋ฅผ ํ์ธํ๋ ์ฐ์ฐ์ ์ํํ๋ ค๊ณ ํ๋ค. ์งํฉ์ ํํํ๋ ํ๋ก๊ทธ๋จ์ ์
www.acmicpc.net
๋ฌธ์ ํ์ด
import sys
sys.setrecursionlimit(100000)
n,m=map(int, sys.stdin.readline().split())
# union-find ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ
# ์งํฉ์ root ๋ฒํธ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด ์ฌ์ฉ
root_set=[x for x in range(n+1)]
def find(num):
global root_set
if num!=root_set[num]:
root_set[num] = find(root_set[num])
return root_set[num]
# if num==root_set[num]:
# return num
# else:
# root_set[num]=find(root_set[num])
def union(x,y):
global root_set
x=find(x)
y=find(y)
root_set[y]=x
for _ in range(m):
command, n1, n2=map(int, sys.stdin.readline().split())
if command==0:
# ๋ ๋ฒํธ๊ฐ ์ํ ์งํฉ์ ํฉ์น๋ค.
union(n1,n2)
elif command==1:
# ๋ ๋ฒํธ๊ฐ ๊ฐ์ ์งํฉ์ ์ํ๋์ง ํ์ธํ๋ค.
if find(n1)==find(n2):
print('YES')
else:
print('NO')
์งํฉ์ ํฉ์น๊ณ , ์งํฉ์ ๋ฃจํธ๋ฅผ ์ฐพ๋ Union-Find ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๋ฌธ์ ์๋ค.
์งํฉ์ ํธ๋ฆฌ ํํ๋ก ๊ตฌํํด์ ์งํฉ๋ผ๋ฆฌ ํฉ์ณ์ค ๋, ๊ฐ์ ๋ฃจํธ๋ฅผ ๊ฐ์ง๋ ํธ๋ฆฌ๋ก ๋ง๋ค์ด์ฃผ๊ณ ,
๋์ผํ ์งํฉ์ ์ํ๋์ง ์ฐพ์ ๋๋ ๋์ผํ ๋ฃจํธ๋ฅผ ๊ฐ์ง๋์ง ํ์ธํด์ฃผ๋ฉด ๋๋ค.
๋ชจ๋ ์งํฉ์ ๋ฃจํธ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํํด์ค๋ค.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ซ์๊ฐ ์ํ ์งํฉ์ ๋ฃจํธ๋ฅผ ์ฐพ์์ฃผ๋ find ํจ์๋ ๋ฃจํธ๋ฅผ ์ฐพ๋ ์ซ์์ root_set[] ๋ฐฐ์ด ๊ฐ์ด ์๊ธฐ ์์ ๊ณผ ๊ฐ์ ๋ ์ฆ, ํด๋น ์ซ์์ ์์ ์ด๋ค ์ซ์๋ ์กด์ฌํ์ง ์๋ ๋ฃจํธ์ผ ๋๊น์ง ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํด์ ์ต์ข ๋ฃจํธ๋ฅผ ์ฐพ๋๋ค.
์ด ํจ์๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ TypeError๊ฐ ๋ฐ์ํ๋ค.
def find(num):
global root_set
if num==root_set[num]:
return num
else:
root_set[num]=find(root_set[num])
์ฒ์์ find ํจ์๋ฅผ ์์ ๊ฐ์ด ์์ฑํ์๋๋ฐ, ๋๋ฒ๊น ์ ํด๋ณด๋ union ํจ์๋ฅผ ์คํํ๋ ๊ณผ์ ์์ find ํจ์๊ฐ 'None'๋ฅผ ๋ฐํํ ์ํ์์ root_set ๋ฐฐ์ด ๊ฐ์ ์ค์ ํด์ฃผ๋ ค๋ค ๋ณด๋ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ฆ, root_set[None]์ ์ด๋ค ๊ฐ์ ํ ๋นํ๊ฑฐ๋ root_set[์ด๋ค ์]=None์ ํ ๋นํ๋ ค ํ ๊ฒ์ด๋ค.
๊ทธ ๊ฒฐ๊ณผ, root_set ๋ฐฐ์ด ์์ None๊ฐ์ด ๋ค์ด๊ฐ๋ค๋ณด๋ ํ์ ๊ณผ์ ์์ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฑฐ๋ root_set[None]์ ์ด๋ค ๊ฐ์ ํ ๋นํ๋ ค๊ณ ํ๋ ๊ณผ์ ์์ ํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์ด๋ฌํ ์๋ฌ๊ฐ ๋ฐ์ํ ์ผ์ด ๋ฐ์ํ ์ด์ ๋ฅผ ์ฐพ์๋ณด๋
์ ์์์์ root_set=[0,1,2,1,4,5,7,7]์ธ ์ํฉ์์ find(3)์ ํ ๋ ํด๋น ์ํฉ์ด ๋ฐ์ํ๋ค.
์์ ๊ฐ์ด, return ๊ฐ์ด ์๋ ์ํ๋ก find(3)์ด ์ข ๋ฃ๋๋ ์ํฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ์ผ์ด์๋ค.
๊ทธ๋์ find ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ค.
def find(num):
global root_set
if num!=root_set[num]:
root_set[num] = find(root_set[num])
return root_set[num]
๊ผผ๊ผผํ๊ฒ ์ฝ๋ฉํ์...!
๊ทธ๋ฆฌ๊ณ ๋ ์งํฉ์ ํฉ์ณ์ฃผ๋ union ํจ์๋ find ํจ์๋ฅผ ์ด์ฉํด์ ๊ฐ ์์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ฐพ์์ ๊ฐ์ ๋ฃจํธ๋ฅผ ๊ฐ์ง๋๋ก ํ ๋นํด์ค๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์น๋ค๋ณด๋ฉด root_set ๋ฐฐ์ด์ ๊ฐ๊ฐ ์์ ์ ๋ถ๋ชจ ๋ ธ๋๋ฅผ ์ ์ฅํ๊ณ ์๋ ์ํ๊ฐ ๋๊ณ , find ํจ์๋ฅผ ํตํด์ ์ต์ข ๋ฃจํธ๋ฅผ ์ฐพ์๊ฐ๋ฉด์ ๊ฐ ๋ฌธ์ ์ ๋ํ ๋ต์ ์ถ๋ ฅํ๋ฉด ๋๋ค. (YES or NO)
'์๊ณ ๋ฆฌ์ฆ > ์ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 1010 ๐ฅ] ๋ค๋ฆฌ ๋๊ธฐ (0) | 2023.11.02 |
---|---|
[๋ฐฑ์ค 2559 ๐ฅ] ์์ด (0) | 2023.07.31 |