バックアップ1260:DFSとBFS

1774 ワード


問題解決の考え方
  • グラフィック理論
  • 深度優先ナビゲーション(DFS)と幅優先ナビゲーション(BFS)
  • ✔コード
    import sys
    from collections import deque
    
    N, M, V = map(int, sys.stdin.readline().split())
    
    graph = [[] for _ in range(N+1)]
    
    for _ in range(M):
        A, B = map(int, sys.stdin.readline().split())
        graph[A].append(B)
        graph[B].append(A)
    
    #DFS
    visited = []
    stack = [V]
    
    while stack:
        tmp = stack.pop()
        if tmp not in visited:
            visited.append(tmp)
            plus = list(set(graph[tmp]) - set(visited))
            plus.sort(reverse=True)
            stack += plus
            
    for i in range(len(visited)):
        print("{} ".format(visited[i]), end="")
    print()
    
    #BFS
    visited = []
    queue = deque([V])
    
    while queue:
        tmp = queue.popleft()
        if tmp not in visited:
            visited.append(tmp)
            plus = list(set(graph[tmp]) - set(visited))
            plus.sort()
            queue += plus
            
    for i in range(len(visited)):
        print("{} ".format(visited[i]), end="")
    print()
  • 演算を最小化するためにDequeモジュールを使用した.
  • 深度優先ナビゲーション(DFS)はスタックを使用し、幅優先ナビゲーション(BFS)はキューを使用する.
  • は、この問題では小数から出力したいので、スタックに入れるときに降順に並べ替えて入れます.
  • の繰返し値を除去するために、集合(Set)も使用される.

  • 初めて解いたDFS、BFS問題!解き方を熟知してみる
    ✔関連概念(リンク参照)
  • DFSとBFSの概念:https://devuna.tistory.com/322
  • Pythonコード:https://cyc1am3n.github.io/2019/04/26/bfs_dfs_with_python.html2
  • を参照
  • スタックとキューを使用する理由