Data structures (with python) - 2. Graph - 2.1. Directed graph
Data structures (with python) - 2. Graph - 2.1. Directed graph
π‘ A directed graph is graph, i.e., a set of objects (called vertices or nodes) that are connected together, where all the edges are directed from one vertex to another. A directed graph is sometimes called a digraph or a directed network. In contrast, a graph where the edges are bidirectional is called an undirected graph.
λ°©ν₯μ± κ·Έλνλ μλ‘ μ°κ²°λ κ°μ²΄(μ μ λλ λ ΈλλΌκ³ ν¨)μ μ§ν©μΌλ‘, λͺ¨λ κ°μ₯μλ¦¬κ° ν μ μ μμ λ€λ₯Έ μ μ μΌλ‘ ν₯νλ κ·Έλνμ λλ€. λ°©ν₯μ± κ·Έλνλ μ΄μ€κ·Έλν(digraph) λλ λ°©ν₯μ± λ€νΈμν¬λΌκ³ λ λΆλ¦½λλ€. μ΄μ λμ‘°μ μΌλ‘, κ°μ₯μλ¦¬κ° μλ°©ν₯μΈ κ·Έλνλ₯Ό 무방ν₯ κ·ΈλνλΌκ³ ν©λλ€.
with python μ΄λ νμ΄μ¬μμ λ°©ν₯μ± κ·Έλνμ λν΄ μμλ΄ μλ€.
νμ΄μ¬μμ λ°©ν₯μ± κ·Έλν (Directed Graph) λ₯Ό ꡬννκ³ νμνλ λ°©λ².
μΈμ 리μ€νΈ(Adjacency List)μ μ¬μ©ν΄μ μ€λͺ νκ² μ΅λλ€.
(μΈμ 리μ€νΈ μΆν λ€λ£¨κΈ°)
class DirectedGraph:
def __init__(self):
self.graph = {}
def add_edge(self, node, neighbour):
if node not in self.graph:
self.graph[node] = [neighbour]
else:
self.graph[node].append(neighbour)
λ¨Όμ , λ°©ν₯μ± κ·Έλνλ₯Ό μ μ₯νλ ν΄λμ€λ₯Ό μμ±ν©λλ€.
μ΄ ν΄λμ€λ λ Έλλ€μ λͺ©λ‘μ μ μ₯νκ³ , λ Έλλ€ κ°μ μ°κ²° κ΄κ³λ₯Ό κ΄λ¦¬ν©λλ€.
μμ μ½λμμ add_edge λ©μλλ₯Ό μ¬μ©ν΄ λ Έλκ°μ μ£μ§λ₯Ό μΆκ°ν μ μμ΅λλ€.
μ΄ λ©μλλ λ°©ν₯μ± μ£μ§λ₯Ό νννλ―λ‘, λ Έλμμ μ΄μ λ Έλλ‘λ§ μ°κ²°λ©λλ€.
λ€μμΌλ‘, μ΄ κ·Έλνλ₯Ό κΉμ΄ μ°μ νμ(DFS)νλ λ©μλλ₯Ό μΆκ°ν΄ λ³΄κ² μ΅λλ€.
DFSλ νμ¬ λ Έλμμ κ°λ₯ν κΉκ² νμνκ³ , λ μ΄μ λ°©λ¬Έν λ Έλκ° μμ λ μ΄μ λ Έλλ‘ λμκ°λ λ°©μμΌλ‘ μλν©λλ€.
(μΆνμ DFS, BFSλ₯Ό λ€λ£Ήλλ€)
def dfs(self, node, visited): # μ μ½λμ μ΄μ΄μ§λλ€ λ€μ¬μ°κΈ° μ£Όμ
if node not in visited:
visited.append(node)
if node in self.graph:
for neighbour in self.graph[node]:
self.dfs(neighbour, visited)
return visited
μμ λ©μλμμ visitedλ λ°©λ¬Έν λ Έλλ€μ λͺ©λ‘μ μ μ₯νλ 리μ€νΈμ λλ€.
μ¬κ·μ μΌλ‘ dfsλ©μλλ₯Ό νΈμΆνμ¬ κ·Έλνλ₯Ό νμν©λλ€.
μ΄ ν΄λμ€λ₯Ό μ¬μ©νμ¬ λ°©ν₯μ± κ·Έλνλ₯Ό μμ±νκ³ νμν΄ λ΄ μλ€.
g = DirectedGraph()
g.add_edge('A', 'B')
g.add_edge('A', 'C')
g.add_edge('B', 'D')
g.add_edge('C', 'D')
print(g.dfs('A', [])) # ['A', 'B', 'D', 'C']
μμ μ½λμμ 'A' λ Έλμμ μμνμ¬ DFSλ₯Ό μννλ©΄, 'B', 'D', 'C'μμλ‘ λ Έλλ₯Ό λ°©λ¬Ένκ² λ©λλ€.