https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
정석이네
문제 접근
말그대로 DFS와 BFS를 사용하는 문제다.
검색해보니 dfs를 재귀로 푼 블로그가 많던데, 재귀는 죽어도 쓰기 싫어서 그냥 while문으로 풀었다.
간선은 2차원배열로 생성했다. a, b 를 입력받았다면 [a][b]와 [b][a]를 둘 다 간선이 있다고 체크해야한다. 양방향이기 떄문.
코드
from collections import deque
import sys
input = sys.stdin.readline
"""
"""
def DFS(N, edges, V):
visited = [False]*(N+1)
stack = [V]
answer = []
while stack:
num = stack.pop()
if visited[num]:
continue
answer.append(num)
visited[num] = True
for i in range(N, 0, -1):
if edges[num][i] and not visited[i]:
stack.append(i)
return answer
def BFS(N, edges, V):
visited = [False]*(N+1)
que = deque([V])
visited[V] = True
answer = [V]
while que:
num = que.popleft()
for i in range(1, N+1):
if edges[num][i] and not visited[i]:
visited[i] = True
answer.append(i)
que.append(i)
return answer
N, M, V = map(int,input().split())
edges = [[False] * (N+1) for i in range(N+1)]
for i in range(M):
a, b = map(int,input().split())
edges[a][b] = True
edges[b][a] = True
print(*DFS(N, edges, V))
print(*BFS(N, edges, V))
224ms
'백준 > 문제풀이_python' 카테고리의 다른 글
1389 케빈 베이컨의 6단계 법칙 _python (0) | 2022.12.05 |
---|---|
1074 Z _python (0) | 2022.12.05 |
1038 감소하는 수 _python (0) | 2022.12.01 |
1025 제곱수 찾기 _python (0) | 2022.11.30 |
1697 숨바꼭질 _python (0) | 2022.11.28 |
댓글