728x90
# Baekjoon 11724번: 연결 요소의 개수
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split())
visited = [None for _ in range(N+1)]
graph = [[] for _ in range(N+1)]
cnt = 0
for i in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
def BFS(i):
global cnt
q = deque()
q.append(graph[i])
visited[i] = True
while q:
for v in q.popleft():
if visited[v] == None:
visited[v] = True
q.append(graph[v])
for i in range(1, N+1):
if visited[i] == None:
cnt +=1
BFS(i)
print(cnt)
그래프를 이용한 BFS/DFS 알고리즘 문제이다. 문제에서 서로 연결된 정점들을 알려줬기 때문에 이를 이용하여 그래프를 먼저 만들도록 한다. 그리고 for문으로 정점을 차례대로 거치면서 방문하지 않았을 경우에는 cnt에 1을 더한 후 BFS 알고리즘을 진행한다.
BFS 내부에서는 deque를 이용해 정점의 그래프를 추가하고, 방문을 True로 변환해준다. 그 뒤 while문 안에서 deque에 있는 그래프를 추출한 뒤 그 안에 있는 정점 요소들을 방문하도록 한다.
예제 2번의 graph를 그림으로 나타내면 위와 같다. 각 정점마다 연결되어 있는 정점이 요소로 속해져있는 것을 확인할 수 있다. 이것이 그래프 문제를 시작할때의 기본이다.
728x90
'BaekJoon' 카테고리의 다른 글
[Baekjoon/Python] 15686번: 치킨 배달(BackTracking) (2) | 2024.10.11 |
---|---|
[Baekjoon/Python] 14940번: 쉬운 최단거리(BFS) (0) | 2024.10.06 |
[Baekjoon/Python] 1931번: 회의실 배정(Greedy) (0) | 2024.10.05 |
[Baekjoon/Python] 2178번: 미로 탐색(BFS) (2) | 2024.09.26 |
[Baekjoon/Python] 1697번: 숨바꼭질(BFS) (2) | 2024.09.26 |