깊이 우선 탐색 예제 - 1
Last updated
Last updated
n(노드 개수) m(에지 개수)
a(그래프 데이터 저장 인접 리스트)
visit(방문 기록 리스트)
dfs:
visit 리스트에 현재 노드 방문 기록
현재 노드의 연결 노드 중 방문하지 않은 노드로 dfs 실행(재귀 함수)
for m 반복:
a 인접 리스트에 그래프 데이터 저장
for n 반복:
if 방문하지 않은 노드가 있다면:
연결 요소 개수 값 1 증가
dfs 실행
연결 요소 개수 값 출력import sys
sys.setrecursionlimit(10000)
input = sys.stdin.readline
n, m = map(int, input().split())
a = [[] for _ in range(n+1)]
visit = [False] * (n+1)
def dfs(node):
visit[node] = True
for i in a[node]:
if not visit[i]:
dfs(i)
for _ in range(m):
u, v = map(int, input().split())
a[u].append(v) # 양방향 연결
a[v].append(u)
count = 0
for i in range(1, n+1):
if not visit[i]:
count += 1
dfs(i)
print(count)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static boolean[] visit;
static ArrayList<Integer>[] a;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
visit = new boolean[n + 1];
a = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = new ArrayList<Integer>();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
a[u].add(v);
a[v].add(u);
}
int count = 0;
for (int i = 1; i <= n; i++) {
if (!visit[i]) {
count++;
dfs(i);
}
}
System.out.println(count);
}
private static void dfs(int node) {
visit[node] = true;
for (int n : a[node]) {
if (!visit[n]) {
dfs(n);
}
}
}
}