[백준] 1260번 - DFS와 BFS
📩 출처
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
👉 생각
- 먼저 각 노드의 인접리스트를 만들고 정렬시켜준다. (정점의 번호가 작은 것을 먼저 방문하라고 했기 때문에!)
dfs
는visited
리스트의 인덱스를 정점으로 하는 곳을 방문하면 True로 바꿔주는 것을 재귀를 통해 구현했다.bfs
는 큐에 처음 시작 노드를 삽입하고pop
을 한 값을 인덱스로 하는visit
값이True
라면 해당 노드를 방문한 것이기 때문에 출력해주고 그 때의 인접해 있는 노드들을 큐에 삽입해 준다.- 이후 큐의 앞에서부터 인접해 있는 노드들을 모두 방문해 준다!
def dfs(adjList, v, visited):
visited[v] = True
print(v, end=' ')
for i in adjList[v]:
if not visited[i]:
dfs(adjList, i, visited)
def bfs(adjList, v):
visit = [0] * (n + 1)
q = []
q.append(v)
while q:
tmp = q.pop(0)
if not visit[tmp]:
visit[tmp] = True
print(tmp, end=' ')
q.extend(adjList[tmp])
return
n, m, v = map(int, input().split())
lst = []
for _ in range(m):
lst.extend(list(map(int, input().split())))
adjList = [[] for _ in range(n+1)]
for i in range(m):
n1, n2 = lst[i*2], lst[i*2+1]
adjList[n1].append(n2)
adjList[n2].append(n1)
adjList = list(map(sorted, adjList))
visited = [0] * (n + 1)
dfs(adjList, v, visited)
print()
bfs(adjList, v)
Author And Source
이 문제에 관하여([백준] 1260번 - DFS와 BFS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@letgodchan0/백준-1260번-DFS와-BFS저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)