๐Ÿ“–Graph

๐Ÿ“–DFS(Depth-First Search)

์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด์„œ branch(๋‹ค์Œ ๋ถ„๊ธฐ)๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ํ•ด๋‹น ๋ถ„๊ธฐ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํƒ์ƒ‰ํ•˜๋Š” ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ ๋ฐฉ๋ฒ•

๐Ÿ“–ํŠน์ง•

  • ์žฌ๊ท€์ ์œผ๋กœ ๋™์ž‘
  • ๊ทธ๋ž˜ํ”„์— cycle์ด ์žˆ๋Š”์ง€ ํŒŒ์•… ๊ฐ€๋Šฅ
  • ํ˜„์žฌ ์ˆœํšŒ ์ค‘์ธ ๋…ธ๋“œ๋งŒ ์ €์žฅํ•˜๋Š” stack์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๊ฐ€ ์ ์Œ

๐Ÿ“–๊ณผ์ •

  1. ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•ด ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
  2. ์Šคํƒ์˜ top์— ์œ„์น˜ํ•˜๋Š” ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ์ „๋ถ€ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
  3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์Šคํƒ์˜ top์„ pop
  4. 2,3 ๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ(์Šคํƒ์— ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ)๊นŒ์ง€ ๋ฐ˜๋ณต

๐Ÿ“–๊ตฌํ˜„

๐Ÿ“Ž์žฌ๊ท€

from collections import deque
 
visited = []
 
def dfs(graph, node, visited):
    visited.append(node)
    
    for adj in graph[node]:
        if adj not in visited:
            dfs(graph, i, visited)
  • visited์— ํƒ์ƒ‰ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ

๐Ÿ“ŽStack

def dfs(graph, node):
    stack = [node]
    visited = []
    
    while stack:
        v = stack.pop()
        visited.append(v)
        
        for adj in graph[v]:
            if adj not in visited:
                stack.append(i)
  • visited์— ํƒ์ƒ‰ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ

๐Ÿ“–์‹œ๊ฐ„ ๋ณต์žก๋„

๊ทธ๋ž˜ํ”„ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์‹œ๊ฐ„๋ณต์žก๋„
์ธ์ ‘ ํ–‰๋ ฌO(nยฒ)
์ธ์ ‘ ๋ฆฌ์ŠคํŠธO(n+e)

๐Ÿ“–BFS & DFS