문제: https://www.acmicpc.net/problem/11724
목표 :
- 연결되지 않는 노드들의 개수를 구하라
조건 :
- 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2)
- 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v)
- 같은 간선은 한 번만 주어진다.
푸는법 :
- bfs와 dfs 모두 구할 수 있다.
dfs 로 구하기
import sys
sys.setrecursionlimit(10**6)
# n은 10**3인데 for문 두번이랑 같으니 10 **6으로 해야한다
n, k = map(int, input().split())
# a = [list(map(int, input().split())) for _ in range(k)]
graph = {}
for i in range(1,n+1):
graph[i] = set()
for _ in range(k):
a, b = map(int, input().split())
graph[a].add(b)
graph[b].add(a)
visited = [False] * (n+1)
def dfs(v):
global visited, graph
if visited[v]: return
# 만약 이미 visited한 거면 return
visited[v] = True
for i in graph[v]:
return dfs(i)
ans = 0
for j in range(1,n+1):
if visited[j] == False:
dfs(j)
ans += 1
print(ans)
bfs로 구하기
import sys
sys.setrecursionlimit(10**6)
n, m = map(int, sys.stdin.readline().split())
graph = {}
for i in range(1, n+1):
graph[i] = set()
chk = [False]*(n+1)
for _ in range(m):
a, b = map(int, sys.stdin.readline().split())
graph[a].add(b)
graph[b].add(a)
def bfs(i):
chk[i] = True
for s in graph[i]:
if not chk[s]:
bfs(s)
ans = 0
for i in range(1, n+1):
if not chk[i] :
bfs(i)
ans += 1
print(ans)