ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1260번 : DFS와 BFS(Python, 파이썬)
    카테고리 없음 2021. 1. 7. 14:20

    풀어본 문제를 복습하고 있다.

     

    '단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고'라는 조건을 주의해야 한다.

     

    인접 리스트의 요소에 접근했을 때 BFS의 경우 인접 리스트 요소를 오름차 순, DFS의 경우 인접 리스트 요소를 내림차 순으로 정렬해주어야 한다.

     

    예를 들면 인접 리스트의 특정 요소 adj[i] = [2,5,1]이 있다고 가정하자.

     

    오름차 순으로 정렬 시 adj[i] = [1,2,5], 내림차 순으로 정렬 시 [5,2,1]이다.

     

    원소들은 정점이므로 queue와 stack에 담아주면 queue = [... 1, 2, 5], stack = [... 5, 2, 1]로 쌓이게 된다.

     

    이렇게 되면 탐색을 진행 시 queue와 stack 둘 다에서 정점 번호가 작은 것을 먼저 꺼낼 수 있게 된다. (queue는 선입선출, stack은 선입 후출이므로)

     

    import sys, collections
    
    def bfs(n, st, adj, res1):
      visited = [0] * (n+1)
      q = collections.deque()
      q.append(st)
    
      while q:
        v = q.popleft()
        if not visited[v]:
          visited[v] = 1
          res1.append(v)
    
        for sv in adj[v]:
          if not visited[sv]:
            q.append(sv)
    
      return res1
    
    
    def dfs(n, st, adj, res2):
      visited = [0] * (n+1)
      stack = []
      stack.append(st)
    
      while stack:
        v = stack.pop()
        if visited[v] == 0:
          visited[v] = 1
          res2.append(v)
    
        for sv in sorted(adj[v], reverse=True):
          if not visited[sv]:
            stack.append(sv)
            
      return res2
    
    n, m, v = map(int, sys.stdin.readline().split())
    
    adj = [[] for _ in range(n+1)]
    
    for _ in range(m):
      s, e = map(int, sys.stdin.readline().split())
    
      adj[s].append(e)
      adj[e].append(s)
    
    for i in range(1, len(adj)):
      adj[i] = sorted(adj[i])
    
    print(" ".join(map(str,dfs(n, v, adj, []))))
    print(" ".join(map(str,bfs(n, v, adj, []))))

     

Designed by Tistory.