기록하는삶
[코딩 테스트 연습(파이썬/Python)] 백준 1260번 _ DFS와 BFS 본문
728x90
반응형
https://www.acmicpc.net/problem/1260
[문제]
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
[입력]
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
[출력]
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
[아이디어]
1) 인접 리스트 생성이 필요하며, 정렬해주어야 순서대로 방문이 가능하다.
2) 탐색 도중 더 이상 간선이 존재하지 않아 탐색이 중단되는 경우를 고려해야 한다.
from collections import deque
n,m,v = map(int, input().split())
g=dict()
for _ in range(m):
a,b=map(int, input().split())
g[a], g[b]=g.get(a,[]) + [b], g.get(b,[]) + [a]
for x in g:
g[x] = sorted(g[x])
visit = [False]*(n+1)
def dfs(graph,v,visit):
visit[v] = True
print(v, end = ' ')
if v not in graph:
return
for i in graph[v]:
if not visit[i]:
dfs(graph, i, visit)
dfs(g,v,visit)
print()
def bfs(graph,v,visit):
q=deque([v])
visit[v] = True
results = []
while q:
now = q.popleft()
results.append(now)
if now not in graph:
return results
else:
for j in graph[now]:
if not visit[j]:
q.append(j)
visit[j]=True
return results
visit = [False]*(n+1)
print(*bfs(g,v,visit))
728x90
반응형
'백준(Python) > 그래프, 그래프탐색' 카테고리의 다른 글
[코딩 테스트 연습(파이썬/Python)] 백준 7576번 _ 토마토 (0) | 2021.12.27 |
---|---|
[코딩 테스트 연습(파이썬/Python)] 백준 1012번 _ 유기농 배추 (0) | 2021.12.24 |
[코딩 테스트 연습(파이썬/Python)] 백준 2606번 _ 바이러스 (0) | 2021.12.24 |
[코딩 테스트 연습(파이썬/Python)] 백준 2667번 _ 단지번호붙이기 (0) | 2021.12.24 |
[코딩 테스트 연습(파이썬/Python)] 백준 2178번 _ 미로탐색 (0) | 2021.11.30 |