"์ฐ๊ฒฐ ์์์ ๊ฐ์" ๋ผ๋ ๋ง์ด ์ ๋งคํด์ ๊ฒ์ํด๋ณด๋, ๋ง๋ค์ด์ง๋ "๊ทธ๋ํ์ ๊ฐ์"์๋ค
์ฐ์ ๋ชจ๋ ๋
ธ๋๋ฅผ map์ผ๋ก ๋ง๋ค๊ณ , visited ๋ฐฉ๋ฌธ๊ฒ์ฌlist๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ์
dfs(idx)๋ก ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ์ฌ, ๋ฐฉ๋ฌธํ๋ฉด visited[idx]๋ฅผ 1๋ก ๊ณ ์ณ์ฃผ๋ฉด์ idx๊ฐ ์ฆ๊ฐํ ๋๋ง๋ค ์นด์ดํ
(cnt+1) ํด์ฃผ์
์ฌ๊ท์ ์ผ๋ก map์ ์๋ ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ ๋ cnt๋ฅผ ๋ฐํํ์
dfs()
ํจ์๋ฅผ ๋ง๋ค๊ณ ,for loof
๋ฅผ 1~n+1๊น์ง ์ฆ๊ฐ์ํค๋ฉฐ visited[i] == 0
์ผ ๋ dfs()
๋ฅผfor loof
idx ์ฆ๊ฐํ ๋๋ง๋ค ์นด์ดํ
)import sys
input = sys.stdin.readline
n,m = map(int, input().split())
node = [list(map(int, input().split())) for _ in range(m)]
amap = [[] for _ in range(n+1)]
#amap์ ๊ทธ๋ํ ํ์์ผ๋ก ๋ฃ๊ธฐ
for u,v in node:
amap[u].append(v)
amap[v].append(u)
cnt = 0
visited = [0]*(n+1)
def dfs(v):
visited[v] = 1
for i in amap[v]:
if not visited[i]:
dfs(i)
for i in range(1, n+1):
#visited[i] == 0์ผ๋๋ง dfs(i)์คํ
if not visited[i]:
dfs(i)
cnt += 1
print(cnt)
import sys
input = sys.stdin.readline
n,m = map(int, input().split())
node = [list(map(int, input().split())) for _ in range(m)]
amap = [[] for _ in range(n+1)]
for u,v in node: #node์ [u, v]
amap[u].append(v) #node[u]์ v์ ์ฅ
amap[v].append(u) #node[v]์ u์ ์ฅ
โamap ์ ์ฅ ์๋ฆฌ
ex. ์
๋ ฅ๊ฐ์ด 1 2, 2 5 ์ธ ๊ฒฝ์ฐ
- node์ ์
๋ ฅ๋ฐ์ผ๋ฉด์ ์ ์ฅ๋๋ ํํ
node[0] = [1, 2]
node[1] = [2, 5]
โปnode = [[1, 2], [2, 5]]
- for loof์์ amap์ ์ ์ฅ๋๋ ํํ
1. i == 0:
amap[1].append(2)
amap[2].append(1)
2. i == 1:
amap[2].append(5)
amap[5].append(2)
โปamap[1] = 2
amap[2] = 1, 5
amap[5] = 2
โ ์
๋ ฅ๊ฐ์ด u โ v ํํ๋ก๋ง ๋ค์ด์ค๋๊น, u โ vํํ๋ก ์ ์ฅํด์ค๋ค๊ณ ์๊ฐํ๋ฉด ํธํจ
โโ DFS, BFS ๋ฌธ์ ๋ค๋ฃฐ ๋ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ์ตํด๋์
(์๋ฐฉํฅ ์ธ๋ฑ์ฑ == ๊ทธ๋ํ)
cnt = 0 #์ฐ๊ฒฐ์์ ๊ฐ์ ์ ์ฅ
visited = [0]*(n+1) #๋ฐฉ๋ฌธ์ฌ๋ถ ๊ฒ์ฌ
def dfs(v):
visited[v] = 1
for i in amap[v]:
if not visited[i]:
dfs(i)
for i in range(1, n+1):
if not visited[i]:
dfs(i)
cnt += 1
print(cnt)
โ์ ์์ ์์ DFS ๋์์๋ฆฌ
visited = [0,0,0,0,0,0,0]
(visited๋ฅผ n+1ํ๋ ์ด์ : ๊ทธ๋ํ ์ธ๋ฑ์ฑ์ 1~n๊น์ง๋ก ํด์คฌ์ผ๋ฏ๋ก,
์ฌ์ค์ visited[0]๊ฐ์ ์ฐ์ง ์๋๋ค.)
1. for loof์ผ๋ก i๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ ๊ทธ๋ํ(amap)์ ์ธ๋ฑ์ค๊ฐ i์ผ ๋,
visited[i]๋ก ์ธํด i๋ฒ์งธ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ํ์ธํ๋ค.
2. ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด, dfs(i)๋ฅผ ํธ์ถํ์ฌ visited[i] = 1 ์ ์ฅํ๊ณ ,
i์ธ๋ฑ์ค์ ๋
ธ๋๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ๋ค.
์ ๋ชจ๋ฅด๊ฒ ์ผ๋, ์์ 1๋ฅผ ์๋ก ๋ค์ด๋ณด์
#amap[1] = 2, 5
#amap[2] = 1, 5
#visited = [0, 0, 0, 0, 0, 0, 0]์ธ ์ํฉ
for 1 in range(1, n+1):
if not visited[1]: #visited[1] == 0์ด๋ฏ๋ก True
dfs(1) #dfs(1)ํธ์ถ
cnt += 1 #์ด๊ฑด for i๊ฐ 1์ธ ์ํฉ์ด ์ข
๋ฃ๋๋ฉด ์คํ๋๋ค!!
#dfs(1)๋์
def dfs(1):
visited[1] = 1 #visited = [0, 1, 0, 0, 0, 0, 0]์ด ๋จ
for i in amap[1]: #amap[1]์ธ 2, 5๋ฅผ ํ๋์ฉ ๊ฒ์ฌ
if not visited[2]: # visited[2] = 0์ด๋ฏ๋ก True
dfs(2) #dfs(2)ํธ์ถ
#dfs(2)๋์
def dfs(2):
visited[2] = 1 #visited = [0, 1, 1, 0, 0, 0, 0]์ด ๋จ
for i in amap[2]: #amap[2]์ธ 1, 5๋ฅผ ํ๋์ฉ ๊ฒ์ฌ
if not visited[5]: # visited[1] = 1์ด๋ฏ๋ก False
dfs(5) #dfs(5)ํธ์ถ
#dfs(5)๋์
def dfs(5):
visited[5] = 1 #visited = [0, 1, 1, 0, 0, 1, 0]์ด ๋จ
...
...
๊ฒฐ๊ตญ ์ฒซ for loof์ i๊ฐ 1์ธ ์ํฉ์ด ์ข
๋ฃ๋๋ฉด cnt += 1์ด ์คํ๋์ด
[1,2,5]๋
ธ๋๊ฐ ํ๋์ ์ฐ๊ฒฐ๋
ธ๋์์ด ํ์ธ๋๊ณ , ์ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ
[3,4,6]๋
ธ๋๊ฐ ํ๋์ ์ฐ๊ฒฐ๋
ธ๋์์ด ํ์ธ๋๋ฉด์ cnt +=1 ๊ฐ ์คํ๋๋ค.
๐๐ป ๊ฒฐ๊ณผ๋ cnt = 2 ์ฐ๊ฒฐ๋
ธ๋๋ 2๊ฐ์ด๋ค
โDFS ๋์์๋ฆฌ
๋ณดํต DFS๋ ํ ๋
ธ๋๋ฅผ ์ค์ ์ผ๋ก dfs(start, end, depth)
ํํ๋ก,
for loof์์ i๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ dfs(i, end, depth)
๋ฅผ ํธ์ถํ๋ฉด์
start == end
์ผ ๋ depth๋ฅผ ์ ์ฅ or return ํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค.
#์ด๋ฐ๋๋
dfs(start, end, depth):
if start == end:
return depth
for i in map[start]:
dfs(i, end, depth) #start๋ฅผ i๋ก ์ก์์ ์ฌ๊ทํจ์๋ก ๋ฐ๋ณตํธ์ถ
๊ทธ๋ฌ๋ ์ด๋ฒ ์์ ์ ๊ฐ์ด, for loof
์ผ๋ก dfs()
ํธ์ถ ํ์๋ฅผ ์กฐ์ ํ๋ ์ผ์ข
์ Back-Tracking ์๊ณ ๋ฆฌ์ฆ์ ํจ๊ป ์ฌ์ฉํ์ฌ, DFSํธ์ถ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ค.