https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
문제 자체는 아무런트릭이 없지만 그래프 탐색 알고리즘을 먼져 공부해야 풀 수 있는 문제
깊이 우선 탐색(BFS -Depth-First Search)
은 말 그대로 깊이를 우선하는 탐색이다.
재귀함수를 이용하여 구현하며, 가장 깊은곳까지 탐색한 후 더이상의 노드가 없을 때,
그제서야 그 전 단계의 다른 노드를 탐색한다.
구글링을 통해 그림을 찾아왔다.

## 코드##
def dfs(graph,v,visited):
visited[v]=True
print(v,end=' ')
for i in graph[v]:
if not visited[i]:
dfs(graph, i , visited)
너비 우선 탐색(BFS, Breadth-First Search)
DFS가 끝을 보고서야 돌아왔다면, 얘는 순차적이다.
시작 노드에서 방문할 수 있는 노드를(깊이1) 모두 방문한 뒤, 그 후에 깊이 1인 모든 노드에서 방문가능한 모든 노드를 방문한다.

##코드##
from collections import deque
#deque를 안쓰고 pop(0)을 활용해도 됨
def bfs(graph, start,visited):
q=deque([start])
visited[start]=True
while q:
v=q.popleft()
print(v,end='->')
for i in graph[v]:
if not visited[i]:
q.append(i)
visited[i]=True
이 개념들을 바탕으로, 입력받아서 그래프를 구현 후 풀어나가자
##전체문제풀이##
def dfs(graph,v,visit1):
visit1[v]=True
print(v,end=' ')
for i in graph[v]:
if not visit1[i]:
dfs(graph,i,visit1)
def bfs(graph, v, visit2):
q=[]
visit2[v]=True
q.append(v)
while q:
tmp=q.pop(0)
print(tmp, end=' ')
for i in graph[tmp]:
if not visit2[i]:
q.append(i)
visit2[i]=True
n,m,v=map(int,input().split())
graph=[[]for _ in range(n+1)]
for _ in range(m):
a,b=map(int,input().split())
graph[a].append(b)
graph[b].append(a)
for g in graph:
g.sort()
visit1=[False for _ in range(n+1)]
visit2=visit1.copy()
dfs(graph,v,visit1)
print()
bfs(graph,v,visit2)'boj' 카테고리의 다른 글
| 백준 15652 N과 M (4) (0) | 2022.04.06 |
|---|---|
| 백준 6064 카잉 달력 (0) | 2022.04.05 |
| 백준 2565 전깃줄 (0) | 2022.04.04 |
| 백준 11170 0의 개수 (0) | 2022.04.03 |
| 백준 1748 수 이어쓰기 1 (0) | 2022.04.02 |