Graph Search

Graph Search

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(DFS)๊ณผ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)์ด ์žˆ๋‹ค.

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ Stack์„ ์ด์šฉํ•œ๋‹ค. ๋ฃจํŠธ ๋…ธํŠธ์—์„œ ์ถœ๋ฐœํ•ด ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋ฅผ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•œ ํ›„ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค. ๋” ์ด์ƒ ํƒ์ƒ‰ํ•  ๋…ธ๋“œ๊ฐ€ ์—†๋Š”์ง€ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉด์„œ ํƒ์ƒ‰ํ•œ๋‹ค.

print("Graph - DFS")
graph = { 
         'A': set(['B', 'C']),
         'B': set(['A', 'D', 'E']),
         'C': set(['A']),
         'D': set(['B', 'F']),
         'E': set(['B']),
         'F': set(['D'])
         }
root = 'A'

def DFS(graph, root):
    visited = []
    stack = [root]
    
    while len(stack) > 0:
        node = stack.pop()
        if node not in visited:
            visited.append(node)
            stack += graph.get(node) - set(visited)
    return visited
    
print(DFS(graph, root))

๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์€ Queue๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฃจํŠธ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ์šฐ์„  ๋ฐฉ๋ฌธํ•œ๋‹ค.

print("Graph - BFS")
graph = { 
         'A': set(['B', 'C']),
         'B': set(['A', 'D', 'E']),
         'C': set(['A']),
         'D': set(['B', 'F']),
         'E': set(['B']),
         'F': set(['D'])
         }
root = 'A'

def BFS(graph, root):
    from collections import deque
    visited = []
    queue = deque([root])
    
    while len(queue) > 0:
        node = queue.popleft()
        if node not in visited:
            visited.append(node)
            queue += graph.get(node) - set(visited)
    
    return visited

print(BFS(graph, root))

Last updated

Was this helpful?