from collections import deque
import sys
input = sys.stdin.readline
def BOJ1260():
def dfs(start, visited, graph):
stack = []
stack.append(start)
print(start, end=" ")
while stack:
node = stack.pop()
visited[node] = True
for next in range(1, len(graph[node])):
if visited[next] == False and graph[node][next] == 1:
visited[next] = True
dfs(next, visited, graph)
def bfs(start, visited, graph):
queue = deque()
queue.append(start)
while queue:
node = queue.popleft()
visited[node] = True
print(node, end=" ")
for next in range(1, len(graph[node])):
if visited[next] == False and graph[node][next] == 1:
visited[next] = True
queue.append(next)
N, M, V = map(int, input().split())
graph = [[0 for _ in range(N+1)] for _ in range(N+1)]
for _ in range(M):
start, end = map(int, input().split())
graph[start][end] = 1
graph[end][start] = 1
visited = [False for _ in range(N+1)]
dfs(V, visited, graph)
print()
visited = [False for _ in range(N+1)]
bfs(V, visited, graph)
BOJ1260()
접근방법 :
0. dfs, bfs 가장 기본적인 문제이다.
1. dfs는 재귀, bfs는 queue를 이용하였다.
장애물 이였던 것 :
1. dfs를 stack을 이용해서 풀어주었을때 출력해 주는 부분에서 계속 해결하지 못했다.
재귀함수를 이용하는 것으로 변경하였고 방문해주는 순서대로 알맞게 출력해줄수 있었다.
2. stack을 이용해서 푼 경우 1번에 2번과 4번 정점이 연결되어있는 경우 2번을 타고 들어가는 것이 아니라 2번 찍고 4번까지 가서 4번을 타고 들어가서 그러했다. 재귀로 변경하여 해결하였다.
stack에 중간에 break를 넣어서 해결하려 했으나 점점 산으로 갔다.
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
파일 합치기[백준 11066] - python (0) | 2022.02.20 |
---|---|
스티커[백준 9465] - python (0) | 2022.02.19 |
편의점 2 [백준 14400] - python (0) | 2022.02.16 |
행렬 곱셈 순서 [백준 11049] -python (0) | 2022.02.15 |
Dance Dance Revolution [백준 2342] - python (0) | 2022.02.14 |