μμμ λ ¬(Topological Sort)
Categories: Algorithm
Example of topological sort
μ΄λ€ μ°μμ μ΄μ§λ§ νΉμ ν μμκ° μλ ν μ€ν¬λ€μ μ°λ¦¬λ topological sortλ₯Ό μ μ©ν μ μμ΅λλ€. μλ₯Όλ€λ©΄ μ·μ μ κ³ νκ΅λ₯Ό κ°λκ²μ μμ λ‘λ€μλ©΄ μ μΈ , μμ·, μλ§μ€ μ΄λ€κ²μ λ¨Όμ μ λλλ μ€μνμ§ μμ§λ§ λ°μ§λ₯Ό μ κΈ°μ μ μμ·μ μ λλ€λμ§ μλ μλ§μ μ κΈ°μ μ λ°μ μ λ νλλ€μ μ΄μν κ²°κ³Όλ₯Ό κ°μ Έμ¬κ² μ λλ€. λ°λΌμ κ²°κ³Όμ μΌλ‘ μ μΌνμ§(unique) μμ§λ§ νΉμ ν μμκ° μ‘΄μ¬νλκ²μ λΆλͺ νκ³ μμμ μμ κ°λ₯ν topological orderingμ λ€μκ³Ό κ°μ κ²μ λλ€.
λ€μμ λ§μ μν©λ€μ΄ μμμ μ κ°μ΄ λ°©ν₯κ·Έλν(directed graph)λ₯Ό μ¬μ©νμ¬ ννλ μ μμ΅λλ€. μλ₯Όλ€λ©΄, program build dependencies, college class prerequisites, event scheduling, assembly instruction λ±μ΄ μμμ λ ¬μ ν΅ν΄ ννλ μ μμκ² μ λλ€.
μ μ
μμμ λ ¬μ΄λ λ°©ν₯κ·Έλνμ λ Έλμ λν μ λ ¬μ λλ€.
λνμ μΌλ‘ Kahnβs algorithmμ΄ μκ³ μ΄λ₯Ό μννμμκ²½μ° O(V+E) μκ°λ³΅μ‘λμμ μμμ λ ¬μ μνν μ μμ΅λλ€. μ£Όμν΄μΌν λ΄μ©μΌλ‘ μμμ λ ¬μ κ³ μ ν κ°μ κ°μ§κ³ μμ§ μμ΅λλ€. μ΄λ λ€μν κ²°κ³Όκ°μ΄ μ‘΄μ¬ν μ μλ€λκ²μ μλ €μ€λλ€.
쑰건
λͺ¨λ κ·Έλνλ¬Έμ κ° μμμ λ ¬λ¬Έμ μ μ ν©νμ§ μμ΅λλ€. μ€λ‘μ§ DAGs(directed acyclic graphs)λ§μ΄ μ νν κ²°κ³Ό κ°μ μ»μ μ μμ΅λλ€. μ¦ λ°©ν₯κ·Έλνμ΄λ©΄μ μ¬μ΄ν΄μ΄ μμλ κ°λ₯ν©λλ€.
Kahnβs algorithm
μ λ°μ μΈ μκ³ λ¦¬μ¦μ μ°μ λ°λ³΅μ μΌλ‘ λ€λ₯Ένλμ μ’ μλμ§ μμ λ Έλλ€μ κ·Έλνμμ μ κ±°νν κ²°κ³Όκ°μ μΆκ°ν΄μ£Όλ κ²μ λλ€.
μμ λ₯Ό νλ λ³΄κ² μ΅λλ€.
λ 립μ μΈ λ Έλλ, λ Έλμ λ€μ΄μ€λ in-orderκ° 0μ΄λ λ§κ³Ό λΉμ·ν©λλ€. κ·Έλνμ μ΄μ κ°μ λ Έλλ€μ μ°Ύμνμ μ λΆ νμ λ£μ΄μ€λλ€. μ΄λ κ² νλ©΄ κ°μ₯λ¨Όμ λ Έλ 2κ° νμ λ€μ΄μ¬ κ²μ λλ€. μ΄λ₯Ό κ·Έλνμμ μ κ±°νν κΈ°μ‘΄μ μ’ μλμλ λ Έλ0κ³Ό λ Έλ4μ λν΄μλ κ²°κ³Όλ₯Ό λ°μν΄μ€λλ€. κ·Έλ¦¬κ³ λ§μ½ λ Έλ 0κ³Ό 4κ° μ΄λ‘μΈν΄ λ 립μ μΈ λ Έλκ° λμλ€λ©΄ μ΄λ₯Ό λ€μ νμ λ£μ΄μ£Όλ νμμΌλ‘ λ°λ³΅ν©λλ€. μ΄λ₯Ό μννμκ²½ν νλμ κ°λ₯ν μμμ λ ¬μ [2, 0, 4, 3, 5, 1] μ λλ€.
μ½λ
vector<int> FindTopologicalOrdering(g)
{
// κ·Έλνμ κ°λ
Έλμ λν΄ inorderλ₯Ό κ³μ°ν¨
n = g.size();
vector<int> in_degree(n);
for(int i=0; i<n; ++i)
{
for(auto& to : g[i])
{
in_degree[to] = in_degree[to] + 1;
}
}
//μΈμ€λμ κ°μ΄ 0μΈ κ²½μ° μ¦ λ
립μ μΈ λ
Έλλ§ νμ λ£μ΄μ€λ€
queue<int> q;
for(int i =0; i<n; ++i)
{
if(in_degree[i] == 0)
{
q.push(i);
}
}
/*
1. νλ₯Ό νμΈνμ¬ λ
립μ μΈ λ
Έλλ€μ λν΄ μμ
μ μννλ€.
2. ν΄λΉλ
Έλλ₯Ό κ²°κ³Όμ μΆκ°μν¨λ€.
3. κΈ°μ‘΄μ ν΄λΉλ
Έλμ μ’
μλ°μλ λ
Έλλ€μ μΈμ€λ κ°μ μ κ±°ν΄μ€λ€
4. λμ΄μ μ’
μλμ§ μμ λ
Έλλ€μ νμ μΆκ°ν΄μ€λ€.
μ΄λ₯Ό λ°λ³΅νλ€.
*/
int index = 0;
vector<int> order(n);
while(!q.empty())
{
int at = q.front();
q.pop();
order[index++] = at;
for(auto to:g[at])
{
in_degree[to] = in_degree[to]-1;
if(in_degree[to] == 0)
{
q.push(to);
}
}
}
// index κ°μ΄ λ
Έλμ μμ κ°μ§ μλ€λκ²μ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ€λκ²μ μλ―Έν©λλ€.
// λ§μ½ A->B->C->A μ κ·Έλνκ° μλ€κ³ κ°μ νμ κ²½μ° μ΄λ ν λ
Έλλ
Έ νμ μΆκ°λμ§ μμ΅λλ€. λ°λΌμ μΈλ±μ€ κ°μ nμ΄ λ μ μμ΅λλ€.
if(index != n)
{
return NULL;
}
return order;
}
Reference
- μ΄ λ ΈνΈλ topological sortλ₯Ό μ°Έκ³ νμ΅λλ€.
Leave a comment