
κ·Έλνλ νμ€ μΈκ³μ 볡μ‘ν κ΄κ³λ₯Ό ν¨κ³Όμ μΌλ‘ λͺ¨λΈλ§ν μ μλ λνμ μΈ μλ£κ΅¬μ‘°μ λλ€. μλλ κ·Έλνμ μ μ, μ’ λ₯, νμ©, κ·Έλ¦¬κ³ μ½λλ‘ νννλ λ°©λ²κΉμ§ νλμ μ 리ν λ΄μ©μ λλ€.
κ·Έλν(Graph)λ κ°μ²΄(λ
Έλ, μ μ )μ μ΄λ€ μ¬μ΄μ μ°κ²°(κ°μ )λ‘ κ΅¬μ±λ μλ£κ΅¬μ‘°μ
λλ€.
μ¦, μ μ (Vertex, Node)μ μ§ν© Vμ κ°μ (Edge)μ μ§ν© Eλ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
κ·Έλνλ λΉμ ν μλ£κ΅¬μ‘°λ‘, νΈλ¦¬λ³΄λ€ λ λ€μν μ°κ²° ꡬ쑰λ₯Ό ννν μ μμ΅λλ€.
νμ€ μΈκ³μ κ°μ²΄μ κ·Έ μ°κ²° κ΄κ³λ₯Ό κ·Έλν μλ£κ΅¬μ‘°λ‘ ννν μ μμ΅λλ€.
κ°μ²΄λ λ Έλ(μ μ ), μ°κ²° κ΄κ³λ κ°μ μΌλ‘ μ μν μ μμ΅λλ€.
μμ:
λ
Έλ(μ μ ): A, B, C, D, E, F
κ°μ : A-B, B-C, B-E, C-D, E-D, E-F
κ·Έλνλ λ€μν λΆμΌμμ νμ©λ©λλ€:
κ΅ν΅λ§/μ§λ: λμ(μ μ ), λλ‘(κ°μ )
μ»΄ν¨ν° λ€νΈμν¬: μ»΄ν¨ν°/λΌμ°ν°(μ μ ), μ°κ²°(κ°μ )
μμ
λ€νΈμν¬: μ¬μ©μ(μ μ ), μΉκ΅¬/νλ‘μ°(κ°μ )
λ€λΉκ²μ΄μ
, μΆμ² μμ€ν
λ±
κ·Έλν νμ μκ³ λ¦¬μ¦(DFS, BFS λ±)μ νμ©ν΄ μ΅λ¨κ±°λ¦¬, κ²½λ‘ νμ, λ€νΈμν¬ λΆμ λ± λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
무방ν₯ κ·Έλν(Undirected Graph)

- κ°μ μ λ°©ν₯μ±μ΄ μλ κ·Έλνμ
λλ€. λ λ
Έλλ μλ°©ν₯μΌλ‘ μ°κ²°λ©λλ€.
- AβBλ‘ κ° μ μμΌλ©°, BβAλ‘λ κ° μ μμ΅λλ€. μλ‘ μ°κ²°λ μνμ
λλ€.

κ°μ μ λ°©ν₯μ±μ΄ μμ. AβBλ λμ§λ§, BβAλ μ΄λ λΆκ°

3.κ°μ€μΉ κ·Έλν vs λΉκ°μ€μΉ κ·Έλν

λ°©ν₯ λΉμν κ·Έλν(DAG, Directed Acyclic Graph)λ λ§ κ·Έλλ‘ λ°©ν₯μ±μ΄ μλ κ·Έλν(Directed Graph) μ€ μ¬μ΄ν΄μ΄ μλ κ·Έλνλ₯Ό μλ―Έν©λλ€. DAGλ μμ μ λ ¬(Topological Sorting)μ΄ κ°λ₯νλ©°, μμ μ€μΌμ€λ§, μμ‘΄μ± κ·Έλν, μ»΄νμΌλ¬ μ΅μ ν λ±μ λ¬Έμ μμ μμ£Ό νμ©λ©λλ€.
κ·Έλνλ₯Ό μ½λλ‘ νννλ λνμ μΈ λ°©λ²μ μΈ κ°μ§μ λλ€:
int[][] matrix = {
{0, 1, 0, 0, 0, 0}, // A
{1, 0, 1, 0, 1, 0}, // B
{0, 1, 0, 1, 0, 0}, // C
{0, 0, 1, 0, 1, 1}, // D
{0, 1, 0, 1, 0, 1}, // E
{0, 0, 0, 1, 1, 0}, // F
};
μ₯μ : κ°μ μ‘΄μ¬ μ¬λΆλ₯Ό μ¦μ νμΈ κ°λ₯
λ¨μ : μ μ μκ° λ§κ³ κ°μ μ΄ μ μ κ²½μ°(ν¬μ κ·Έλν) λ©λͺ¨λ¦¬ λλΉκ° νΌ



μ₯μ : λ©λͺ¨λ¦¬ ν¨μ¨μ , λ
Έλ μΆκ°/μμ μ©μ΄
λ¨μ : μ°κ²° μ¬λΆ νμΈμ μΈμ νλ ¬λ³΄λ€ λ릴 μ μμ
Map<String, List<String>> graph = new HashMap<>() {{
put("A", List.of("B"));
put("B", List.of("A"));
put("C", List.of());
put("D", List.of());
put("E", List.of());
put("F", List.of());
}};
λ¬Έμ μμ κ°μ μ 보(edges)κ° μ£Όμ΄μ§ λ, μ΄λ₯Ό μΈμ 리μ€νΈ(list)λ‘ λ³νν μ μμ΅λλ€
edges = [[0, 1], [0, 3], [0, 6], [1, 3], [2, 3], [3, 7], [4, 5], [5, 6], [5, 7]]
n = 8 # λ
Έλμ κ°μ
μΈμ 리μ€νΈ λ³ν μ½λ
// μΈμ 리μ€νΈ μ΄κΈ°ν
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
graph.add(i, new ArrayList<>()); // κ° λ
Έλμ λν΄ λΉ λ¦¬μ€νΈ μΆκ°
}
// μλ°©ν₯ κ°μ μΆκ°
for (int[] edge : edges) {
int a = edge[0];
int b = edge[1];
graph.get(a).add(b); // a -> b μ°κ²°
graph.get(b).add(a); // b -> a μ°κ²° (μλ°©ν₯)
}
μΌλ°©ν₯ κ·ΈλνμΈ κ²½μ°
λ§μ½ λ¬Έμ μμΒ μΌλ°©ν₯ κ·ΈλνλΌκ³ λͺ μλμλ€λ©΄, λ€μκ³Ό κ°μ΄ λ³νν΄μΌ ν©λλ€.
// μΈμ 리μ€νΈ μ΄κΈ°ν
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>()); // κ° λ
Έλμ λν΄ λΉ λ¦¬μ€νΈ μΆκ°
}
// μΌλ°©ν₯ κ°μ μΆκ°
for (int[] edge : edges) {
int a = edge[0];
int b = edge[1];
graph.get(a).add(b); // a -> b μ°κ²°
}
List<List<Integer>> graph = new ArrayList<>() {{
add(List.of(1, 3, 6));
add(List.of(0, 3));
add(List.of(3));
add(List.of(0, 1, 2, 7));
add(List.of(5));
add(List.of(4, 6, 7));
add(List.of(0, 5));
add(List.of(3, 5));
}};