이번에 푸는 문제는 백준 알고리즘 1260번: DFS와 BFS로 난이도는 Siver 2 에 해당한다.
문제는 다음과 같다.
이문제는 기본적인 BFS/DFS 개념을 코드로 구현한 문제로,
예제 입력과 출력만 잘 맞추어서 넣어주면 된다.
DFS의 경우, Depth를 타고 들어가면서 탐색하므로 재귀를 쓰게되고,
BFS의 경우, 같은 Depth끼리 보면서 탐색하므로 queue를 활용하게된다.
나동빈님 블로그에서 자세한 개념을 볼 수 있다.(책으로 이전에 공부했었고, 다시 복습하면서 참고했음)
15. 너비 우선 탐색(BFS)
너비 우선 탐색(Breadth First Search, BFS)은 탐색을 할 때 너비를 우선으로 하여 탐색을 수행하는 ...
blog.naver.com
# 작성자 : SH_WON_96
# 2020-09-06
# 2020-12-29 review
# 알고리즘 - Graph
# 문제번호 : 1260
# 초기 입력값 받기
import sys
import math
input = sys.stdin.readline
N,M,V = map(int, input().split(" "))
# Input받을 Graph (N+1)X(N+1)로 만들기
G = [[0 for i in range(N+1)] for j in range(N+1)]
# M개의 간선, 연결있으면 1로 변경
for i in range(M):
x,y = map(int,input().split(" "))
# 대칭이니깐 양쪽 다 써줌
G[x][y] = 1
G[y][x] = 1
def BFS(G,s):
queue = [] # queue는 내가 방문해야할 노드 모음
Visit = [] # Visit은 내가 방문한 노드 모음
queue.append(s)
Visit.append(s)
while(len(queue)!=0):
# queue에서 앞에서 하나씩 꺼내서 아랫층(?) 탐색
poped = queue.pop(0)
for i in range(1,N+1):
# 방문해야할 노드들을 순차적으로 queue 뒷쪽으로 넣고, 방문한 것으로 처리
if(G[poped][i]== 1 and (i not in Visit)):
queue.append(i)
Visit.append(i)
return Visit
def DFS(s,Visited):
Visited.append(s)
# s 노드에서 갈 수 있는 연결노드로 들어가기
for i in range(1, N + 1):
# 해당 노드는 연결이 있으면서, 방문한적이 없어야 함.
if (G[s][i] == 1 and (i not in Visited)):
DFS(i,Visited)
return Visited
visit = []
# 이건 리스트로 나와서 아래처럼 처리.
# print(DFS(V,visit))
# print()
# print(BFS(G,V))
for i in DFS(V,visit):
print(i,end=" ")
print()
for i in BFS(G,V):
print(i,end=" ")
문제는 아래 ↓링크↓
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
'[스터디] 알고리즘' 카테고리의 다른 글
[Python] 백준 알고리즘 4693번: 섬의 개수 (0) | 2021.01.05 |
---|---|
[Python] 백준 알고리즘 2178번: 미로 탐색 (0) | 2021.01.04 |
[Python] 백준 알고리즘 1463번: 1로 만들기, DP문제 (0) | 2020.12.29 |
[Python] 백준 알고리즘 1003번 : 피보나치 함수, DP문제 (0) | 2020.12.22 |
[Python] 백준 알고리즘 스터디 재시작 (0) | 2020.12.22 |