https://www.acmicpc.net/problem/11724
# 양방향 그래프 가변 배열로
graph = [[] for _ in range(N+1)]
for _ in range(M):
graph[a].append(b)
graph[b].append(a)
# dfs
def dfs(start, visited):
visited[start] = True
# 캐시 사용
visited = [False] * (N+1)
for start in range(1, N):
if not visited[start]:
dfs(start, visited) ..
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
def dfs(start, visited):
visited[start] = True
for end in graph[start]:
if not visited[end]:
dfs(end, visited)
N, M = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
visited = [False] * (N+1)
cnt = 0
for node in range(1, N+1):
if not visited[node]:
dfs(node, visited)
cnt += 1
print(cnt)```