โ๋ฌธ์
https://www.acmicpc.net/problem/20040
๋ฉ๋ชจ๋ฆฌ: 116208 KB, ์๊ฐ: 292 ms
์๋ฃ ๊ตฌ์กฐ, ๋ถ๋ฆฌ ์งํฉ
์ฌ์ดํด ๊ฒ์์ ๋ ๋ช ์ ํ๋ ์ด์ด๊ฐ ์ฐจ๋ก๋๋ก ๋์๊ฐ๋ฉฐ ์งํํ๋ ๊ฒ์์ผ๋ก, ์ ํ๋ ์ด์ด๊ฐ ํ์ ๋ฒ์งธ ์ฐจ๋ก๋ฅผ, ํ ํ๋ ์ด์ด๊ฐ ์ง์ ๋ฒ์งธ ์ฐจ๋ก๋ฅผ ์งํํ๋ค. ๊ฒ์ ์์ ์ 0 ๋ถํฐ n − 1 ๊น์ง ๊ณ ์ ํ ๋ฒํธ๊ฐ ๋ถ์ฌ๋ ํ๋ฉด ์์ ์ n ๊ฐ๊ฐ ์ฃผ์ด์ง๋ฉฐ, ์ด ์ค ์ด๋ ์ธ ์ ๋ ์ผ์ง์ ์์ ๋์ด์ง ์๋๋ค. ๋งค ์ฐจ๋ก ๋ง๋ค ํ๋ ์ด์ด๋ ๋ ์ ์ ์ ํํด์ ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ ๋ถ์ ๊ธ๋๋ฐ, ์ด์ ์ ๊ทธ๋ฆฐ ์ ๋ถ์ ๋ค์ ๊ทธ์ ์๋ ์์ง๋ง ์ด๋ฏธ ๊ทธ๋ฆฐ ๋ค๋ฅธ ์ ๋ถ๊ณผ ๊ต์ฐจํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค. ๊ฒ์์ ์งํํ๋ค๊ฐ ์ฒ์์ผ๋ก ์ฌ์ดํด์ ์์ฑํ๋ ์๊ฐ ๊ฒ์์ด ์ข ๋ฃ๋๋ค. ์ฌ์ดํด C๋ ํ๋ ์ด์ด๊ฐ ๊ทธ๋ฆฐ ์ ๋ถ๋ค์ ๋ถ๋ถ์งํฉ์ผ๋ก, ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค.
C์ ์ํ ์์์ ์ ๋ถ์ ํ ๋์ ์์ ์ถ๋ฐํ์ฌ ๋ชจ๋ ์ ๋ถ์ ํ ๋ฒ์ฉ๋ง ์ง๋์ ์ถ๋ฐ์ ์ผ๋ก ๋๋์์ฌ ์ ์๋ค.
๋ฌธ์ ๋ ์ ๋ถ์ ์ฌ๋ฌ ๊ฐ ๊ทธ๋ฆฌ๋ค ๋ณด๋ฉด ์ฌ์ดํด์ด ์์ฑ ๋์๋์ง์ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ์ด๋ ค์ ์ด๋ฏธ ์ฌ์ดํด์ด ์์ฑ๋์์์๋ ๋ถ๊ตฌํ๊ณ ๊ฒ์์ ๊ณ์ ์งํํ๊ฒ ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ฒ์์ ์งํ ์ํฉ์ด ์ฃผ์ด์ง๋ฉด ๋ช ๋ฒ์งธ ์ฐจ๋ก์์ ์ฌ์ดํด์ด ์์ฑ๋์๋์ง, ํน์ ์์ง ๊ฒ์์ด ์งํ ์ค์ธ์ง๋ฅผ ํ๋จํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ค ํ๋ค.
์ ๋ ฅ์ผ๋ก ์ ์ ๊ฐ์ n๊ณผ m ๋ฒ์งธ ์ฐจ๋ก๊น์ง์ ๊ฒ์ ์งํ ์ํฉ์ด ์ฃผ์ด์ง๋ฉด ์ฌ์ดํด์ด ์์ฑ ๋์๋์ง๋ฅผ ํ๋จํ๊ณ , ์์ฑ๋์๋ค๋ฉด ๋ช ๋ฒ์งธ ์ฐจ๋ก์์ ์ฒ์์ผ๋ก ์ฌ์ดํด์ด ์์ฑ๋ ๊ฒ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โ๐ปํ์ด
์ด ๋ฌธ์ ๋ union-find๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด ๋๋ค.
๋งค ์ฐจ๋ก๋ง๋ค ํ๋ ์ด์ด๋ ๋ ์ ์ ์ ํํ๋ค. ์ด๋ find๋ฅผ ์ด์ฉํ์ฌ ๋ ์ ์ด ์ฐ๊ฒฐ๋์ด ์๋ ํ์ธํ๋ค. ๋ค๋ฅด๋ค๋ฉด ์ด ๋์ ์ฐ๊ฒฐ๋์ด์์ง ์์ผ๋ฏ๋ก union์ ์ด์ฉํด ์ฐ๊ฒฐํ๋ฉด ๋๋ค. ๋ง์ฝ find๋ฅผ ์ด์ฉํ์ฌ ๋ ์งํฉ์ ์์๊ฐ ๊ฐ๋ค๋ฉด ํด๋น ์์๊ฐ ์ ํํ ๋ ์ ์ด ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์๋ฏธ๋ก ์ฌ์ดํด์ด ํ์ฑ๋์ด ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด ๋๋ ํ์ฌ ์ฐจ๋ก๋ฅผ ์ถ๋ ฅํ๊ณ for๋ฌธ์ ๋ฉ์ถ๋ฉด ๋๋ค.
๋ง์ฝ for๋ฌธ์ด ์ฌ์ดํด์ ์ฐพ์ง ๋ชปํ๊ณ for๋ฌธ์ด ๋๋๋ฉด for-else๋ฌธ์ ์ฌ์ฉํ์ฌ 0์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๐ป์ฝ๋
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
parent = [i for i in range(n)]
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def union(a, b):
a, b = find(a), find(b)
if find(a) > find(b):
parent[a] = b
else:
parent[b] = a
for i in range(1, m+1):
a, b = map(int, input().split())
if find(a) != find(b):
union(a, b)
else:
print(i)
break
else:
print(0)
๐ํ๊ธฐ
union-find ๋ฌธ์ ๊ฐ ์ด๋ ์ ๋ ์ต์ํด์ง ๊ฒ ๊ฐ์ผ๋ ์ต์ ์ ์ฅ ํธ๋ฆฌ ๋ฌธ์ ์์ kruskal ์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถํ๋ฉด์ ์์ฉํด๋ด์ผ๊ฒ ๋คโบ๏ธ
'Coding Test > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1956. ์ด๋/Python - Gold4 (0) | 2025.08.20 |
---|---|
[๋ฐฑ์ค] 1976. ์ฌํ ๊ฐ์/Python - Gold4 (0) | 2025.08.18 |
[๋ฐฑ์ค] 1717. ์งํฉ์ ํํ/Python - Gold5 (0) | 2025.08.17 |
[๋ฐฑ์ค] 1197. ์ต์ ์คํจ๋ ํธ๋ฆฌ/Python - Gold4 (1) | 2025.08.16 |
[๋ฐฑ์ค] 13549. ์จ๋ฐ๊ผญ์ง3/Python - Gold5 (0) | 2025.08.15 |