[백준] 1260번 - DFS와 BFS

chanyeong kim·2022년 3월 16일
0

백준

목록 보기
41/200
post-thumbnail

📩 출처

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

👉 생각

  • 먼저 각 노드의 인접리스트를 만들고 정렬시켜준다. (정점의 번호가 작은 것을 먼저 방문하라고 했기 때문에!)
  • dfsvisited 리스트의 인덱스를 정점으로 하는 곳을 방문하면 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)

0개의 댓글