반응형
1. 문제
그래프를 DFS 로 탐색한 결과와 BFS 로 탐색한 결과를 출력하는 프로그램을 작성하시오
정점의 개수 N, 간선의 개수 M, 탐색을 시작할 정점의 번호 V
M 개의 줄에는 간선이 연결하는 두 정점의 번호가 주어지고, 입력으로 주어지는 간선은 양방향이다
1 <= N <= 1000, 1 <= M <= 10,000
2. 알고리즘 분류
* 그래프 이론
* 그래프 탐색
* 너비 우선 탐색
* 깊이 우선 탐색
3. 접근 방식
DFS (Stack 이용) 와 BFS (deque 이용) 를 공부한 김에 관련 문제를 풀어봤다
[TIL] DFS 깊이 우선 탐색 BFS 너비 우선 탐색
그래프를 탐색하는 방법에는DFS 깊이 우선 탐색과 BFS 너비 우선 탐색이 있다 그래프에 대한 설명은 그래프 종류와 표현 방식에 정리해 놨다 1. DFSDepth-First Search, 깊이 우선 탐색 최대한 깊이 내
helloahram.tistory.com
4. 코드 구현
첫번째 시도
from collections import deque
def dfs(graph, start):
visited = [False] * len(graph)
stack = [start]
while stack:
v = stack.pop()
if not visited[v]:
print(v, end=' ')
visited[v] = True
for neighbor in reversed(graph[v]):
if not visited[neighbor]:
stack.append(neighbor)
def bfs(graph, start):
visited = [False] * len(graph)
queue = deque([start])
while queue:
v = queue.popleft()
if not visited[v]:
print(v, end=' ')
visited[v] = True
for neighbor in graph[v]:
if not visited[neighbor]:
queue.append(neighbor)
if __name__ == '__main__':
n, m, v = list(map(int, input().split()))
graph = [ [] for _ in range(n+1)]
for _ in range(m):
# 입력으로 주어지는 간선은 양방향이다
u, w = map(int, input().split())
graph[u].append(w)
graph[w].append(u)
dfs(graph, v)
print() # 줄바꿈
bfs(graph, v)
print() # 줄바꿈
DFS, BFS 잘 썼는데 틀렸다고 한다,.....
두번째 시도
from collections import deque
def dfs(graph, start):
visited = [False] * len(graph)
stack = [start]
while stack:
v = stack.pop()
if not visited[v]:
print(v, end=' ')
visited[v] = True
# 이웃 노드를 역순으로 스택에 추가
for neighbor in sorted(graph[v], reverse=True):
if not visited[neighbor]:
stack.append(neighbor)
def bfs(graph, start):
visited = [False] * len(graph)
queue = deque([start])
while queue:
v = queue.popleft()
if not visited[v]:
print(v, end=' ')
visited[v] = True
# 이웃 노드를 정렬하여 큐에 추가
for neighbor in sorted(graph[v]):
if not visited[neighbor]:
queue.append(neighbor)
if __name__ == '__main__':
n, m, v = list(map(int, input().split()))
graph = [ [] for _ in range(n+1)]
for _ in range(m):
# 입력으로 주어지는 간선은 양방향이다
u, w = map(int, input().split())
graph[u].append(w)
graph[w].append(u)
dfs(graph, v)
print() # 줄바꿈
bfs(graph, v)
print() # 줄바꿈
그래프가 정렬되어 있지 않기 때문에 순회 순서가 예상과 다를 수 있다고 피드백을 받아서
이웃 노드 (neighbor) 를 찾을 때 정렬을 추가해줬다 (+ dfs 는 reverse=True 도 해줌)
반응형
'알고리즘' 카테고리의 다른 글
[백준] 1904 01타일 Python (1) | 2024.09.28 |
---|---|
[백준] 2748 피보나치2 Python (1) | 2024.09.28 |
[백준][아직못풀었음] 18352 특정 거리 도시 찾기 Python (2) | 2024.09.24 |
[백준] 1991 트리 순회 Python (0) | 2024.09.21 |
[백준] 18258 큐2 Python (0) | 2024.09.19 |