κ·Έλν μ©μ΄ μ 리
- κ·Έλνλ λ‘λ΄μ΄ μ΅λ¨κ²½λ‘λ₯Ό κ³μ°ν΄μ μμ§μΌ λλ λ΄λΉκ²μ΄μ κ²½λ‘λ₯Ό μλ΄ν λ, μ§νμ² μμ μ΄λμ 건μ€ν΄μΌ κ°μ₯ ν¨μ¨μ μΈμ§ κ³μ°νλ λ± λ§€μ° νλκ² μ¬μ©
- κ·Έλνλ μ μ (vertex)μ μ§ν© V(G)μ μμ§(edge)μ μ§ν© E(G)λ‘ μ μ
무방ν₯ κ·Έλν
- 무방ν₯κ·Έλν(undirected graph)μΈλ°, μ΄λ (A,B)μ (B,A)μ κ°λ€λ μλ―Έ
- μ μ κ°μκ° nκ°λΌλ©΄ μ΄ κ·Έλνμ μ΅λ μμ§ κ°μλ n * (n-1) /2
λ°©ν₯ κ·Έλν
- μ£μ§μ λ°©ν₯μ΄ μλ κ·Έλν
μκΈ° κ°μ
- μ μ μ΄ tail μ΄μ λμμ head μΈ κ·Έλν
λ©ν°κ·Έλν
- μΌλ°μ μΌλ‘ κ·Έλνμμλ μμ§ μ€λ³΅ μΈμ νμ§ μλλ€.
- μ΄ μ€λ³΅ μμ§λ₯Ό μΈμ νλ μλ£ κ΅¬μ‘°λ₯Ό λ©ν° κ·Έλν(multi-graph)
μΈμ
- λ μ μ μ μ°κ²°νλ κ°μ μ΄ μμ λ μλ‘ μΈμ νλ€κ³ νν
κ²½λ‘
- κ²½λ‘λ, μ μ Vi μμ VjκΉμ§μ μ μ μμλ₯Ό μλ―Έ
- κ²½λ‘κΈΈμ΄λ μμ§ κ°μ
μ°κ²°λ κ·Έλν
- μ΄λ€ μ μ uμ λ€λ₯Έ μ΄λ€ μμμ μ μ vλ₯Ό 골λμ λ μ μ μ¬μ΄μ κ²½λ‘κ° μμΌλ©΄ μ΄λ₯Ό μ°κ²°λμλ€ λΌκ³ νλ€.
- μ μ μ§ν© {1,2,5},{3,4,6}μ κ°κ° μ°κ²°μμλΌκ³ νλ€.
μ°¨μ
- 무방ν₯ κ·Έλνμ κ²½μ° μ΄λ€ μ μ vμ μ°¨μ d(v)λ μ μ vκ° λΆμλ μμ§ κ°μ
- 무방ν₯ κ·ΈλνμΌ κ²½μ°, μ μ Aμ λΆμλ μμ§κ° μΈκ°μ΄λ―λ‘ d(A) = 3
- λ°©ν₯ κ·ΈλνμΌ κ²½μ°, μ§μ μ°¨μμ μ§μΆμ°¨μμ ν©
- μ§μ μ°¨μλ μ μ vλ‘ λ€μ΄μ€λ μμ§ κ°μ
- μ§μΆμ°¨μλ μ μ vμμ λκ°λ μμ§ κ°μ
- λΆμ : μ μ uμ μ μ v μ¬μ΄μ μμ§ (u,v)κ° μ‘΄μ¬ν λ μμ§ (u,v)λ₯Ό μ μ uμ λΆμλμλ€λΌκ³ νν
κ·Έλνλ₯Ό νννλ λκ°μ§ λ°©λ²: λμμ λμλ₯Ό μ΄μ΄λ³΄μ
- κ·Έλνλ₯Ό νν νλ λκ°μ§ λ°©λ²μ μΈμ 리μ€νΈ(adjacency list) μ μΈμ νλ ¬(adjacemcy matrix)μ΄ μλ€.
- λ°°μ΄ νκ°μ μ°κ²°λ¦¬μ€νΈλ€λ‘ ꡬμ±λμ΄μμΌλ©°, μ μ μ΄ λ°°μ΄μ μΈλ±μ€κ° λλ€.
- μ΄λ€ μ μ vμ λν΄ μΈμ ν λͺ¨λ λ
Έλλ₯Ό νμνλ μ°μ°μ λν λΉ
μ€λ₯Ό μκ°ν΄λ³΄μ
- μ λ΅ : λͺ¨λ μ μ μ μ‘°μ¬ν νμ μμ΄ ν΄λΉ μ μ μ μΈμ ν μ μ λ€λ§ μ‘°μ¬νλ©΄λκΈ° λλ¬Έμ β> λΉ μ€ O(d(v))
- κ°κ°μ νμ μ μ μΌλ‘ λ³΄κ³ μ΄μ μμ μ ν¬ν¨ν λ€λ₯Έ μ μ μ΄λΌκ³ μκ°νλ©΄ λλ€.
- matrix[1][3]μ κ°μ 무μμΌκΉμ?
- μ λ΅ : 1
- μ μ n μ λν΄ μΈμ ν λͺ¨λ λ
Έλλ₯Ό νμνλ μ°μ°μ λν λΉ
μ€λ₯Ό μκ°ν΄λ³΄μ
- μ λ΅: μ μ κ°μκ° n μ΄λΌκ³ νμλ O(n)
- (2,3)κ° μλμ§ μ¬λΆλ₯Ό νμΈνλ μ°μ°μ λν λΉ
μ€λ₯Ό μκ°ν΄λ³΄μ
- μ λ΅ : matrix[2][3]λ§ νμΈνλ©΄ λκΈ° λλ¬Έμ β> O(1)
κ·Έλνμ λͺ¨λ λ Έλ λ°©λ¬Έ: λͺ¨λ λμλ₯Ό μ¬νν΄λ³΄μ
- λͺ¨λ λ Έλλ₯Ό μννλ λ°©λ²μ λκ°μ§ : λλΉ μ°μ νμ(Breadth Frist Search, BFS)κ³Ό κΉμ΄ μ°μ νμ (Depth First Search, DFS)
- λλΉ μ°μ νμμ νλ₯Ό μ΄μ©ν΄μ ꡬν, κΉμ΄ μ°μ νμμ μ€νμ κΈ°λ°μΌλ‘ ꡬνλ©λλ€.
λλΉ μ°μ νμ(Breadth Frist Search, BFS) : νμμ ν λ λλΉλ₯Ό μ°μ μΌλ‘ νμ¬ νμμ μννλ νμ μκ³ λ¦¬μ¦
- κ²°κ³Όμ μΌλ‘ λ
Έλμ νμ μμ, μ¦ νμ μ½μ
ν μμλ λ€μκ³Ό κ°μ΅λλ€.
- 1 -> 2 -> 3 -> 8 -> 4 -> 5 -> 6 -> 7
from queue import Queue
class Graph:
def __init__(self, vertex_num):
# μΈμ 리μ€νΈλ‘ ꡬν
self.adf_list = [ [] for _ in range(vertex_num)]
# λ°©λ¬Έ μ¬λΆ 체ν¬
self.visited = [ False for _ in arnage(vertex_num)]
def add_edge(self, u, v):
self.adj_list[u].append(v)
self.adj_list[v].append(u)
def init_visited(self):
for i in range(len(self.visited)):
self.visited[i].False
def bfs(self, v):
q = Queue()
# λ°©λ¬Έ μ²΄ν¬ λ¦¬μ€νΈλ₯Ό μ΄κΈ°νν©λλ€.
self.init_visited()
# 첫λ²μ§Έ μ μ μ νμ λ£κ³ λ°©λ¬Έ 체ν¬
q.put(v)
self.visited[v] = True
while not q.empty():
v = q.get()
# λ°©λ¬Έ
print(v, end=" ")
# μΈμ 리μ€νΈλ₯Ό μ»μ΄ μ΅λλ€.
adj_v = self.adj_list[v]
for u in adj_v:
if not self.visited[u]:
q.put(u)
self.visited[u] = True
κΉμ΄ μ°μ νμ(Depth First Search, DFS) : νμμ ν λ λλΉλ₯Ό μ°μ μΌλ‘ νμ¬ νμμ μννλ νμ μκ³ λ¦¬μ¦
- νμμ ν λ κΉμ΄λ₯Ό μ°μ μΌλ‘ νμ¬ νμμ μννλ νμ μκ³ λ¦¬μ¦
- ν λ Έλλ₯Ό μμμΌλ‘ λ€μ λ Έλλ‘ λμ΄κ°κΈ° μ μ ν΄λΉ λ Έλλ₯Ό μλ²½νκ² νμνλ€.
- κ²°κ³Όμ μΌλ‘ λ
Έλμ νμ μμ, μ¦ μ€νμ μ½μ
ν μμλ λ€μκ³Ό κ°μ΅λλ€.
- 1 -> 2 -> 8 -> 6 -> 7 -> 3 -> 4 -> 5
def dfs_recursion(self, v):
# λ°©λ¬Έ
print(v, end=" ")
# λ°©λ¬Έ 체ν¬
self.visited[v] = True
adj_v = self.adj_list[v]
for u in adj_v:
if not self.visited[u]:
self.dfs_recursion(u)
def dfs(self,v):
self.init_visited()
self.dfs_recursion(v)
Source
https://heytech.tistory.com/55
https://heytech.tistory.com/56