λ Έλ(N)μ κ·Έ λ Έλλ₯Ό μ°κ²°νλ κ°μ (E)μ νλλ‘ λͺ¨μ λμ μλ£κ΅¬μ‘°
- μ§λ, λ Έμ λ, λλ‘μ²λΌ μ°κ²°λμ΄ μλ κ°μ²΄κ°μ κ΄κ³λ₯Ό ννν μ μλ μλ£κ΅¬μ‘°
- κ·Έλνλ μ¬λ¬ κ°μ κ³ λ¦½λ λΆλΆ κ·Έλν(Isolated Subgraph)λ€λ‘ ꡬμ±λ μ μλ€
- μΈμ μ μ (adjacent vertex) : κ°μ μ μν΄ μ§μ μ°κ²°λ μ μ
- μΈμ (adjacent) & λΆμ(incident) : μμμ λ μ μ μ΄ νλμ κ°μ μΌλ‘ μ°κ²°λμ΄ μμ κ²½μ°, μ΄ μ μ λ€μ μλ‘
μΈμ
ν΄ μλ€κ³ νλ€. ν΄λΉ κ°μ μ λ λ ΈλμλΆμ
ν΄ μλ€κ³ νλ€ - λΆλΆ κ·Έλν(subgraph) : κ·Έλνμ ν¬ν¨λ μΌλΆ μ μ κ³Ό κ°μ μΌλ‘λ§ μ΄λ£¨μ΄μ§ κ·Έλν
- λΆλΆ μ μ₯ κ·Έλν(sapnning subgraph) : λΆλΆ κ·Έλν μ€ μλ³Έ κ·Έλνμ λͺ¨λ μ μ μ ν¬ν¨ν κ·Έλν (λΆλΆ μ μ₯ κ·Έλνμ κ°μ μ μ β€ μλ³Έ κ·Έλνμ κ°μ μ μ)
- μ μ μ μ°¨μ(degree) : μ μ μ μ°κ²°λ κ°μ μ μ νΉμ κ°μ€μΉμ ν©μ μλ―Ένλ€
- μ§μ μ°¨μ(in-degree) : λ°©ν₯ κ·Έλνμμ μΈλΆμμ ν΄λΉ λ Έλλ‘ μ€λ κ°μ μ μ
- μ§μΆ μ°¨μ(out-degree) : λ°©ν₯ κ·Έλνμμ ν΄λΉ λ Έλμμ μΈλΆλ‘ ν₯νλ κ°μ μ μ
- 루ν(loop) : κ°μ μ μ μ μ°κ²°νλ κ°μ (λ μ μ μ΄ κ°μ μ μ )
- κ³ λ¦½ μ μ (isolated vertex) : μ°κ²°λ κ°μ μ΄ μλ μ μ
- κ²½λ‘(path) : κ°μ μ λ°λΌ μ΄μ΄κ° μ μλ κΈΈ (μ μ μ λμ΄νμ¬ κ²½λ‘λ₯Ό νννλ€)
- κ²½λ‘μ κΈΈμ΄(length) : κ²½λ‘λ₯Ό μ΄λ£¨λ κ°μ μ μ
- simple path : λ°λ³΅λλ κ°μ μ΄ μλ κ²½λ‘
- elementary path : λ°λ³΅λλ μ μ μ΄ μλ κ²½λ‘
- μ¬μ΄ν΄(cycle) : μμ μ μ κ³Ό μ’ λ£ μ μ μ΄ λμΌν κ²½λ‘
- μ°κ²°(connected) : λ μ μ μ¬μ΄μ κ²½λ‘κ° μ‘΄μ¬ν λ λ μ μ μ
μ°κ²°
λμλ€κ³ νλ€- κ°ν μ°κ²°(strongly connected) : μ μ a β b, b β aμ κ²½λ‘κ° μ‘΄μ¬ν κ²½μ°, ν΄λΉ λ°©ν₯ κ·Έλνλ κ°ν μ°κ²°λμλ€κ³ νλ€
- μ½ν μ°κ²°(weakly connected) : a β b λλ b β a κ²½λ‘ μ€ νλλ§ μ‘΄μ¬ν κ²½μ°, ν΄λΉ λ°©ν₯ κ·Έλνλ μ½ν μ°κ²°λμλ€κ³ νλ€
- 무방ν₯ κ·Έλν(undirected graph)
- κ°μ μ ν΅ν΄ μλ°©ν₯μΌλ‘ μ΄λν μ μμ (a,b μ μ μ μ°κ²°νλ κ°μ μ
(a, b)
λ‘ νν)
- κ°μ μ ν΅ν΄ μλ°©ν₯μΌλ‘ μ΄λν μ μμ (a,b μ μ μ μ°κ²°νλ κ°μ μ
- λ°©ν₯ κ·Έλν(directed graph)
- κ°μ μ λ°©ν₯μ΄ μ‘΄μ¬ν¨ (a β bλ‘λ§ κ° μ μλ κ°μ μ
<a, b>
λ‘ νν)
- κ°μ μ λ°©ν₯μ΄ μ‘΄μ¬ν¨ (a β bλ‘λ§ κ° μ μλ κ°μ μ
- κ°μ€μΉ κ·Έλν(weighted graph)
- κ°μ μ λΉμ©μ΄λ κ°μ€μΉκ° ν λΉλ κ·Έλν
- μ°κ²° κ·Έλν(conntected graph)
- 무방ν₯ κ·Έλνμμ μλ λͺ¨λ μ μ μμ κ²½λ‘κ° νμ μ‘΄μ¬νλ κ²½μ°
- λΉμ°κ²° κ·Έλν(disconnected graph)
- 무방ν₯ κ·Έλνμμ νΉμ μ μ μ μ¬μ΄μ κ²½λ‘κ° μ‘΄μ¬νμ§ μλ κ²½μ°
- μν κ·Έλν(cycle graph)
- μ¬μ΄ν΄(μμ μ μ κ³Ό μ’ λ£ μ μ μ΄ λμΌν κ²½λ‘)μ κ°μ§ κ·Έλν
- λΉμν κ·Έλν(acyclic graph)
- μ¬μ΄ν΄μ΄ μλ κ·Έλν
- μμ κ·Έλν(complete graph)
- κ·Έλνμ μν λͺ¨λ μ μ μ΄ μλ‘ μ°κ²°λμ΄ μλ κ·Έλν
- 무방ν₯ μμ κ·Έλν : μ μ μ μκ°
n
μ΄λ©΄ κ°μ μ μλn * (n - 1) / 2
- λ°©ν₯ μμ κ·Έλν : μ μ μ μκ°
n
μ΄λ©΄ κ°μ μ μλn * (n - 1)
μΈμ νλ ¬ λ°©μ & μΈμ 리μ€νΈ λ°©μμΌλ‘ κ·Έλνλ₯Ό ννν μ μμ
- μΈμ νλ ¬(adjacency matrix) : 2μ°¨μ λ°°μ΄λ‘ κ·Έλνμ μ°κ²° κ΄κ³λ₯Ό νννλ λ°©μ
- μ μ a,bκ° μλ‘ μΈμ νλ€λ©΄(νλμ κ°μ μΌλ‘ μ°κ²°λμ΄ μλ€λ©΄) β
νλ ¬[a][b] = 1
, μΈμ νμ§ μλ€λ©΄ βνλ ¬[a][b] = 0
- κ°μ μ κ°μ€μΉκ° μλ€λ©΄ 1 λμ κ°μ€μΉμ κ°μ μ§μ λ£λλ€.
- μ₯μ
- λ μ μ μ λν μ°κ²° μ 보 μ‘°ν β
O(1)
- ꡬνμ΄ μ¬μ
- λ μ μ μ λν μ°κ²° μ 보 μ‘°ν β
- λ¨μ
- κ°μ μ μμ 무κ΄νκ²
n^2
μ λ©λͺ¨λ¦¬ 곡κ°μ΄ νμ β λ©λͺ¨λ¦¬ κ³΅κ° λλΉκ° νΌ - νΉμ μ μ κ³Ό μΈμ ν μ μ λ€μ μ°ΎκΈ° μν΄ ν μ 체λ₯Ό μνν΄μΌ ν¨ β
O(N)
(μΈμ νμ§ μλ λ ΈλκΉμ§ νμν΄μΌ ν¨)
- κ°μ μ μμ 무κ΄νκ²
- μ μ a,bκ° μλ‘ μΈμ νλ€λ©΄(νλμ κ°μ μΌλ‘ μ°κ²°λμ΄ μλ€λ©΄) β
- μΈμ 리μ€νΈ(adjacency list) : 리μ€νΈλ‘ κ·Έλνμ μ°κ²° κ΄κ³λ₯Ό νννλ λ°©μ
- μ₯μ
- νΉμ μ μ κ³Ό μΈμ ν μ μ λ€μ μ°Ύμ λ ν΄λΉ μ μ μ μΈμ 리μ€νΈλ§ μν β
O(N)
(μΈμ ν λ Έλλ€λ§ νμν μ μμ) - μ μ μ μ + κ°μ μ μ(
n+e
) λ§νΌμ λ©λͺ¨λ¦¬ 곡κ°μ΄ νμ β λ©λͺ¨λ¦¬ κ³΅κ° λλΉκ° μ μ
- νΉμ μ μ κ³Ό μΈμ ν μ μ λ€μ μ°Ύμ λ ν΄λΉ μ μ μ μΈμ 리μ€νΈλ§ μν β
- λ¨μ
- λ μ μ μ λν μ°κ²° μ 보λ₯Ό μ‘°ννκΈ° μν΄ μΈμ 리μ€νΈ μ 체λ₯Ό νμν΄μΌ ν¨ β μ΅μ
O(N)
- ꡬνμ΄ μ΄λ €μ
- λ μ μ μ λν μ°κ²° μ 보λ₯Ό μ‘°ννκΈ° μν΄ μΈμ 리μ€νΈ μ 체λ₯Ό νμν΄μΌ ν¨ β μ΅μ
- μ₯μ
κΉμ΄ μ°μ νμ(dfs)μ λλΉ μ°μ νμ(bfs)κ° μμ
- dfsλ μ€νμΌλ‘ ꡬνν μ μμ
def dfs(graph, v, visited):
# λ
Έλvλ₯Ό λ°©λ¬Έμ²λ¦¬
visited[v] = True
print(v, "visit!")
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
print(v, "pop!")
graph = [
[1, 2, 4],
[0, 2],
[0, 1, 3, 4],
[2, 4],
[0, 2, 3]
]
visited = [False] * 5
dfs(graph, 0, visited)
"""
0 visit!
1 visit!
2 visit!
3 visit!
4 visit!
4 pop!
3 pop!
2 pop!
1 pop!
0 pop!
"""
- bfsλ queueλ‘ κ΅¬νν μ μμ
from collections import deque
def bsf(graph, start, visited):
# νμ startλ
Έλλ₯Ό μ§μ΄ λ£λλ€
queue = deque([start])
# startλ
Έλλ₯Ό λ°©λ¬Έμ²λ¦¬νλ€
visited[start] = True
while queue:
print(queue, end=" ")
# νμμ λ
Έλλ₯Ό κΊΌλΈλ€
now = queue.popleft()
# κΊΌλΈ λ
Έλλ₯Ό μΆλ ₯νλ€ : λ°©λ¬Έμ²λ¦¬ν λ μΆλ ₯ν΄λ 무κ΄νμ§λ§, μ΄ λ°©λ²μ΄ λ κ°κ²°
print(now, "visit!")
for i in graph[now]:
if not visited[i]:
queue.append(i)
# νμ μ§μ΄λ£κ³ λμ, λ°©λ¬Έ μ²λ¦¬νλ€
visited[i] = True
graph = [
[1, 2, 4],
[0, 2],
[0, 1, 3, 4],
[2, 4],
[0, 2, 3]
]
visited = [False] * 5
bsf(graph, 0, visited)
"""
deque([0]) 0 visit!
deque([1, 2, 4]) 1 visit!
deque([2, 4]) 2 visit!
deque([4, 3]) 4 visit!
deque([3]) 3 visit!
"""