728x90
[문제]
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
[코드]
#S2_1260 DFS와 BFS.py
from collections import deque
#dfs
def dfs(x): #깊이우선탐색
global graph, visit, answer
visit[x] = 1 #현재 노드 방문 표시
answer.append(x) #방문한 노드 answer 추가
for i in range(1, n+1):
if graph[x][i] == 1 and not visit[i]:
dfs(i) #재귀 호출로 깊이 탐색
return answer
#bfs
def bfs(start): #너비우선탐색
global graph, visit, answer
queue = deque([start]) #deque로 설정
visit[start] = 1 #시작 노드 방문 표시
while queue: #queue가 빌 때까지 반복 실행
x = queue.popleft() #큐에서 노드를 꺼내 방문 여부를 체크하고
answer.append(x) #결과 리스트에 추가
for i in range(1,n+1):
if graph[x][i] == 1 and not visit[i]: #방문하지 않은 노드를 큐에 넣고
queue.append(i) #방문 여부를 체크
visit[i] = 1
return answer
#main
n, m, v = map(int,input().split()) #노드 수, 간선 수, 시작 노드
graph = [[0] * (n+1) for _ in range(n+1)] #그래프 배열 생성
visit = [0] * (n+1) #방문 노드 표시할 배열 생성
answer = [] #방문 순서를 출력할 배열 생성
for i in range(m):
v1, v2 = map(int,input().split())
graph[v1][v2] = 1 #문제에서 양방향 그래프라고 명시
graph[v2][v1] = 1
dfs(v)
print(' '.join(map(str,answer)))
visit = [0] * (n+1) #같은 변수명을 쓰므로 초기화 필요
answer = []
bfs(v)
print(' '.join(map(str,answer)))
반응형
'🚩 Coding Test > Baekjoon' 카테고리의 다른 글
[BOJ][Python] 2644 촌수계산 (0) | 2024.04.08 |
---|---|
[BOJ][Python] 2606 바이러스 (0) | 2024.04.08 |
[BOJ][Python] 9506 약수들의 합 (0) | 2024.04.05 |
[BOJ][Python] 11005 진법 변환 2 (0) | 2024.04.03 |
[BOJ][Python] 2563 색종이 (0) | 2024.04.02 |