그래도 dfs bfs 앞에서 그림그려가면서 공부해서 나름의 자신감을 가지고 시작!!
탐색 알고리즘 - DFS, BFS
탐색은 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정. 주로 그래프나 트리 등의 자료구조에서 값을 찾는다. DFS, BFS는 대표적인 탐색 알고리즘(방법) 자세한 원리는 여기!!(물론 구현은 자
jjrm.tistory.com
1. 문제
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
2. 이해 및 풀이
와 그래도 알고리즘은 이해해서 함수는 구현할 수 있겠는데, 문제는 입력값으로 인접리스트를 만드는 것이다.
그림으로는 쉽게 그려지는데
dfs(깊이 우선탐색)는
스택을 사용하고, 재귀로 구현!(하려고했으나, 재귀보단 그냥 반복문이 편한가보다..)
그리고 dfs에서 작은 수부터 돌기 위해 reversed 사용(아는 척 아는 척)
bfs(너비 우선탐색)는
데크를 사용. 이때 탐색 시작 노드를 데크에 삽입하고 방문 처리(visited에 추가)
큐에서 노드를 꺼내 해당 노드의 인접 노드 중 방문하지 않은 노드를 모두 데크에 삽입하고 꺼냈을 때 visited에 없으면 방문처리를 해준다
->이걸 마지막 노드에 갈 때까지 반복한다.
크게 두가지 방식이 있는 거 같다.
visited를 비어있는 리스트로 두어 채우는 방식과 / visited를 디폴트값으로 false로 둔 다음에 요소가 나올 떄마다 true로 바꿔주는 방식
#. 내 풀이 (채우기)
from collections import deque
import collections
N,M,V = map(int,input().split())
graph = collections.defaultdict(list)
for i in range(M):
a, b = map(int,input().split())
graph[a].append(b)
graph[b].append(a)
graph[a].sort()
graph[b].sort()
def bfs(graph, start):
visited = []
queue = collections.deque([start])
while queue:
n = queue.popleft()
if n not in visited:
visited.append(n)
if n in graph:
queue.extend(graph[n])
return visited
def dfs(graph, start):
visited = []
stack = [start]
while stack:
n = stack.pop()
if n not in visited:
visited.append(n)
if n in graph:
stack.extend(reversed(graph[n]))
return visited
print(*dfs(graph, V))
print(*bfs(graph, V))
#. 다른사람풀이(false->true)
from collections import deque
n, m, v = map(int, input().split())
graph = [[] for _ in range(n + 1)]
for i in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
graph[a].sort()
graph[b].sort()
visited = [False] * (n + 1)
def Dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
Dfs(graph, i, visited)
def Bfs(graph, v, visited):
visited = [False] * (n + 1)
queue = deque([v])
visited[v] = True
while queue:
pop = queue.popleft()
print(pop, end=' ')
for i in graph[pop]:
if not visited[i]:
queue.append(i)
visited[i] = True
Dfs(graph, v, visited)
print()
Bfs(graph, v, visited)
오늘의 교훈 : 입력값을 제대로 쓰자 젭알.
'cs,코딩,알고리즘 > 알고리즘 공부' 카테고리의 다른 글
이진탐색 (0) | 2022.08.02 |
---|---|
백준 - 2606 - 바이러스 [파이썬] (0) | 2022.07.31 |
자료구조 - deque(데크) (0) | 2022.07.30 |
DFS, BFS(ft.인접리스트) (0) | 2022.07.30 |
백준 - 11279- 최대힙 [파이썬] (0) | 2022.07.21 |