반응형
[ Contents ]
1. 문제 (링크 참조)
24444번: 알고리즘 수업 - 너비 우선 탐색 1
첫째 줄에 정점의 수 N (5 ≤ N ≤ 100,000), 간선의 수 M (1 ≤ M ≤ 200,000), 시작 정점 R (1 ≤ R ≤ N)이 주어진다. 다음 M개 줄에 간선 정보 u v가 주어지며 정점 u와 정점 v의 가중치 1인 양방
www.acmicpc.net
2. 문제 풀이
너비 우선 탐색(BFS)을 사용하는 기본 예제입니다.
2022.02.23 - [Algorithm] - [Algorithm] 너비 우선 탐색(BFS), 가까운 주변부터 찾자
[Algorithm] 너비 우선 탐색(BFS), 가까운 주변부터 찾자
BFS는 가까운 주변부터 탐색하는 알고리즘입니다. 큐를 이용한 BFS 구현방법과 코드를 알아보겠습니다. [ Contents ] 1. BFS(Breath First Search) 너비 우선 탐색(BFS): 가까운 주변 노드부터 탐색하며 점점
star7sss.tistory.com
3. 코드
from collections import deque
import sys
input = sys.stdin.readline
N, M, R = map(int, input().split())
graph = [[] for _ in range(N+1)]
# BFS 탐색 (탐색할 그래프, 노드 수, 시작 지점)
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
visited = [0]*(N+1) #방문 여부를 확인할 리스트
visited[R] = 1 #시작 노드 방문
그래프 정보를 입력받습니다. 양방향 그래프이므로, 양쪽에 모두 인접노드를 넣어줍니다.
queue = deque([R]) #인접 노드를 저장할 Queue
#모든 노드를 탐색할 때까지 반복
cnt = 1
while queue:
#방문 노드
node = queue.popleft()
graph[node].sort() # 오름차순으로 방문
#방문한 노드의 주변 노드를 큐에 삽입
for i in graph[node]:
#방문하지 않는 주변 노드일 경우
if not visited[i]:
queue.append(i) #큐에 추가
cnt += 1
visited[i] = cnt #방문
오름차순으로 방문하므로, 차후에 방문할 주변 노드를 탐색하기 전에 정렬부터 합니다.
방문할 때마다 cnt를 올려가며 몇 번째로 방문했는지를 표시합니다.
#출력
for i in visited[1:]:
print(i)
이후 방문순서를 출력합니다.
<전체 코드>
from collections import deque
import sys
input = sys.stdin.readline
N, M, R = map(int, input().split())
graph = [[] for _ in range(N+1)]
# BFS 탐색 (탐색할 그래프, 노드 수, 시작 지점)
for _ in range(M):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
visited = [0]*(N+1) #방문 여부를 확인할 리스트
visited[R] = 1 #시작 노드 방문
queue = deque([R]) #인접 노드를 저장할 Queue
#모든 노드를 탐색할 때까지 반복
cnt = 1
while queue:
#방문 노드
node = queue.popleft()
graph[node].sort() # 오름차순으로 방문
#방문한 노드의 주변 노드를 큐에 삽입
for i in graph[node]:
#방문하지 않는 주변 노드일 경우
if not visited[i]:
queue.append(i) #큐에 추가
cnt += 1
visited[i] = cnt #방문
#출력
for i in visited[1:]:
print(i)
반응형
'Algorithm' 카테고리의 다른 글
[탐색/BFS] 백준 1926 그림 - 파이썬(Python) (0) | 2023.06.30 |
---|---|
[탐색/BFS] 백준 5014 스타트링크 - 파이썬(Python) (1) | 2023.06.30 |
[구현/수학] 백준 10810 공 넣기 - 파이썬(Python) (0) | 2023.06.07 |
[구현/수학] 백준 28061 레몬 따기 - 파이썬(Python) (1) | 2023.06.02 |
[구현/수학] 백준 28135 Since 1973 - 파이썬(Python) (0) | 2023.06.01 |
댓글