μμ μ λ ¬μ΄λ
κ·Έλν μ λ ¬ μκ³ λ¦¬μ¦μ μΌμ’ μΌλ‘, μμκ° μ ν΄μ Έ μλ μΌλ ¨μ μμ μ μ°¨λ‘λλ‘ μνν΄μΌ ν λ μ¬μ©νλ μκ³ λ¦¬μ¦μ λλ€.
μμ μ λ ¬μ΄ κ°λ₯νλ €λ©΄ DAG(Directed Acyclic Graph)μ΄μ΄μΌ ν©λλ€.
- λ°©ν₯μ± O: Node A → Node Bμ κ°μ΄ λ λ Έλ μ¬μ΄ λ°©ν₯μ΄ μμ΄μΌ ν©λλ€.
- μ¬μ΄ν΄ X: A → B, B → Aμ κ°μ μ¬μ΄ν΄μ΄ μμ΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄, μ΄ 3κ°μ κ³Όλͺ©μ΄ μκ³ , ν κ³Όλͺ©μ λ£κΈ° μν μ μ΄μκ³Όλͺ© κ΄κ³κ° νμλμ΄ μμ΅λλ€.
μΈ κ³Όλͺ©μ λͺ¨λ λ£λ μ½μ€λ `νλ‘κ·Έλλ° κΈ°μ΄ → C νλ‘κ·Έλλ° → κ³ κΈ C νλ‘κ·Έλλ°`μ μμκ° λμ΄μΌ ν©λλ€.
`κ³ κΈ C νλ‘κ·Έλλ° → C νλ‘κ·Έλλ° → νλ‘κ·Έλλ° κΈ°μ΄` μμλ μ λλ κ²λλ€.

μ΄μ²λΌ κ·Έλνμμ λ°©ν₯μ±μ ν΅ν΄ μ μ ν μμλ₯Ό μ°Ύλ κ²μ΄ μμ μ λ ¬μ λλ€.
μκ³ λ¦¬μ¦ κ΅¬ν
ꡬν μ μμμΌνλ μ©μ΄κ° μμ΅λλ€.
- μ§μ
μ°¨μ(Indegree)
- νΉμ ν λ Έλλ‘ λ€μ΄μ€λ κ°μ μ κ°μ
- μλ κ·Έλνμμ 6μ μ§μ μ°¨μλ 2
- μ§μΆ μ°¨μ(Outdegree)
- νΉμ ν λ Έλμμ λκ°λ κ°μ μ κ°μ
- μλ κ·Έλνμμ 5μ μ§μΆ μ°¨μλ 1

μμ μ λ ¬μ νλ₯Ό μ΄μ©νμ¬ λ€μκ³Ό κ°μ λ¨κ³λ‘ ꡬνν μ μμ΅λλ€.
νμμ κΊΌλ΄μ§λ μμκ° μμ μ λ ¬ κ²°κ³Όμ λλ€.
π― μμ μ λ ¬ ꡬν 곡μ
| 1. μ§μ
μ°¨μκ° 0μΈ λ
Έλλ₯Ό νμ λ£λλ€. 2. νκ° λΉ λκΉμ§ λ€μμ κ³Όμ μ λ°λ³΅νλ€. 1. νμμ μμλ₯Ό κΊΌλ΄ ν΄λΉ λ Έλμμ λκ°λ κ°μ μ κ·Έλνμμ μ κ±°νλ€. 2. μλ‘κ² μ§μ μ°¨μκ° 0μ΄ λ λ Έλλ₯Ό νμ μ½μ νλ€. |

1λ¨κ³μ λ°λΌ,
μ§μ μ°¨μκ° 0μΈ λ Έλλ₯Ό νμ λ£μΌλ©΄ λ Έλ 1μ΄ μ²μμΌλ‘ λ€μ΄κ°λλ€.

2-1λ¨κ³μ λ°λΌ νμ μλ λ Έλ 1μ κΊΌλ΄κ³ (=1μ΄ μΆλ ₯λ©λλ€) λ Έλ 1μ μμ ν©λλ€.
μ΄λ‘μ¨ μλ‘κ² μ§μ μ°¨μκ° 0μ΄ λ λ Έλ 2μ λ Έλ 5κ° νμ λ€μ΄κ°λλ€.
λ Έλ 2μ λ Έλ 5κ° νμ λ€μ΄κ°λ μμλ μꡬμ¬νμ λ°λΌ λ¬λ¦¬μ§ μ μμ΅λλ€. κ·Έλ₯ μ€λ¦μ°¨μμΌλ‘ λ£μμ΅λλ€.

λ Έλ 2μ λ Έλ 5κΉ νμμ κΊΌλ΄μ§κ³ κ·Έλνμμ μμ λλ©΄μ
λ Έλ 3κ³Ό λ Έλ 6μ μ§μ μ°¨μκ° 0μ΄ λ©λλ€.
μ΄μ΄μ§λ κ³Όμ μ κ·Έλ¦ΌμΌλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.



νκ° λΉκ³ , λͺ¨λ λ Έλκ° μμ λλ©΄μ μ λ ¬μ΄ λλ¬μ΅λλ€.
μ λ ¬ κ²°κ³Όλ `1→2 →5 →3 →6 →4 →7`μ λλ€.
Javaλ‘ κ΅¬ν
import java.util.*;
public class TopologicalSort {
public static void main(String[] args) {
int n = 7; // λ
Έλ κ°μ
// μΈμ 리μ€νΈ μμ±
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i <= n; i++) {
adj.add(new ArrayList<>());
}
addEdge(adj, 1, 2); // 1->2
addEdge(adj, 1, 5);
addEdge(adj, 2, 3);
addEdge(adj, 2, 6);
addEdge(adj, 3, 4);
addEdge(adj, 4, 7);
addEdge(adj, 5, 6);
topologicalSort(n, adj);
}
public static void topologicalSort(int n, List<List<Integer>> adj) {
Queue<Integer> queue = new LinkedList<>();
// step1: μ§μ
μ°¨μκ° 0μΈ λ
Έλ νμ λ£κΈ°
// μ§μ
μ°¨μ κ³μ°
int[] indegree = new int[n+1]; // 0λ² λ
Έλλ μλ΅νλ―λ‘ n+1 ν¬κΈ°λ‘
for(int i=1; i<=n; i++) {
for(int next : adj.get(i)) indegree[next]++;
}
// νμ λ£κΈ°
for(int i=1; i<=n; i++) {
if(indegree[i]==0) queue.add(i);
}
// step2
while(!queue.isEmpty()) {
// νμμ κΊΌλ΄κΈ°
int peek = queue.poll();
System.out.print(peek + " ");
// ν΄λΉ λ
Έλμμ λκ°λ κ°μ μ κ±°
for(int next : adj.get(peek)) {
indegree[next]--; // μ§μ
μ°¨μ -1
if(indegree[next]==0)
// μλ‘κ² μ§μ
μ°¨μκ° 0μ΄ λ λ
Έλ νμ μΆκ°
queue.add(next);
}
}
}
public static void addEdge(List<List<Integer>> adj, int from, int to) {
adj.get(from).add(to);
}
}
μΆλ ₯ κ²°κ³Ό: 1 2 5 3 6 4 7
