2 초 | 128 MB | 261931 | 100887 | 60021 | 37.307% |
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
예제 입력 1 복사
4 5 1
1 2
1 3
1 4
2 4
3 4
예제 출력 1 복사
1 2 4 3
1 2 3 4
예제 입력 2 복사
5 5 3
5 4
5 2
1 2
3 4
3 1
예제 출력 2 복사
3 1 2 5 4
3 1 4 2 5
예제 입력 3 복사
1000 1 1000
999 1000
예제 출력 3 복사
1000 999
1000 999
가장 기본적인 BFS와 DFS알고리즘에 대해 묻는 문제이다.
일단 각 알고리즘의 특성을 알아야 한다.
DFS는 깊이우선탐색이다. 깊이우선탐색은 시작노드부터 인접노드를 탐색할 때, 인접노드에 직접 들어가서 더이상 탐색할 노드가 없을 때 까지 탐색하는 방법이다.
1번 노드부터 시작하고, 번호가 작은 노드를 우선순위로 탐색한다고 할때, DFS에서는 다음과 같은 순서를 얻는다.
1 2 3 4 5 6 7 8 9 10 11 12
BFS는 너비 우선탐색이다. 너비우선탐색은 시작노드부터 인접노드를 탐색할 때, 시작노드에서 인접노드 모두를 탐색 후, 하위의 노드로 이동해 동일한 방법으로 탐색을 진행한다.
따라서 위와 같은 조건으로 BFS에서는 다음과 같은 순서를 얻는다.
1 2 7 8 3 6 9 12 4 5 10 11
이를 코드로 구현하면 다음과 같다.
#DFS
def DFS(li, v, visited):
visited[v] = True
print(v ,end=' ')
for i in li[v]:
if not visited[i]:
DFS(li,i,visited)
#BFS
def BFS(li,start,visited):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in li[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
문제에서 주어진 전체코드는 다음과 같다.
#1260 DFS&BFS
from collections import deque
n,e,start = map(int,input().split())
li = [[] for i in range(n + 1)]
queue = deque()
visited = [False for i in range(n + 1)]
for i in range(e):
a,b = map(int,input().split())
li[a].append(b)
li[b].append(a)
for i in li:
i.sort()
def DFS(li, v, visited):
visited[v] = True
print(v ,end=' ')
for i in li[v]:
if not visited[i]:
DFS(li,i,visited)
def BFS(li,start,visited):
queue = deque([start])
visited[start] = True
while queue:
v = queue.popleft()
print(v, end=' ')
for i in li[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
DFS(li,start,visited)
visited = [False for i in range(n + 1)]
print()
BFS(li,start,visited)
visited라는 배열을 만들어서 해당 노드를 탐색했다면 true 로 , 아니라면 false로 두어 탐색을 한다.
'Study > CodingTest' 카테고리의 다른 글
[백준/Python] (S2)1541 - 잃어버린 괄호 (0) | 2024.02.27 |
---|---|
[백준/Python] (S3)2606 - 바이러스 (0) | 2023.12.08 |
[백준/Python] (S1)14940 - 쉬운 최단거리 (0) | 2023.08.25 |
[백준/Python] (S2)21736 - 헌내기는 친구가 필요해 (0) | 2023.07.27 |
[백준/Python] (G5)10026 - 적록색약 (0) | 2023.07.26 |