topological sort - changicho/algorithm-training GitHub Wiki
μκ° λ³΅μ‘λ : O(V+E)
μμ μ λ ¬μ μ ν₯ λΉμν κ·Έλν(Directed Acyclic Graph, DAG)μμ μμκ° μ ν΄μ Έμλ μμ μ°¨λ‘λ‘ μνν΄μΌ ν λ, κ·Έ μμλ₯Ό κ²°μ ν΄μ£Όλ μκ³ λ¦¬μ¦μ΄λ€.
vector<vector<int> > graph;
vector<int> inDegree; // index λ
Έλμμ κ° μ μλ λ
Έλμ κ°μ
vector<int> result; // μ μ μ λ°©λ¬Ένλ μμ
// μ§μ
μ°¨μκ° 0μΈ λ
Έλλ₯Ό νμ μ½μ
ν©λλ€
queue<int> q;
for (int node = 1; node <= N; node++) {
if (inDegree[node] == 0) {
q.push(node);
}
}
// μ λ ¬μ΄ μμ ν μνλλ €λ©΄ Nκ°μ λ
Έλλ₯Ό μ λΆ λ°©λ¬Έν©λλ€
for(int index = 0; index < N; index++) {
if(q.empty()) {
// nκ°λ₯Ό λ°©λ¬ΈνκΈ° μ μ νκ° λΉμ΄λ²λ¦¬λ©΄ μ¬μ΄ν΄μ΄ λ°μν κ²
// (μ΄μ μ μ§μ
μ°¨μκ° 0μΈ μ μ μ΄ μμλ€λ μλ―Έμ΄λ―λ‘)
break;
}
int cur = q.front();
q.pop();
result[index] = cur;
for(int next : graph[cur]) {
inDegree[next]--;
// μλ‘κ² μ§μ
μ°¨μκ° 0μ΄ λ μ μ μ νμ μ½μ
ν©λλ€
if(inDegree[next] == 0) {
q.push(next);
}
}
}μμ μ λ ¬μ μννλ λμ κ° index κΉμ§ λλ¬νλλ° λ€μ΄κ°λ costλ₯Ό κ°±μ νλ€.
μ¬κΈ°μ νμ¬ μμ κ³Ό μ°κ²°λμ΄ μνλ μμ μ λλ΄κΈ° μν΄ μμλλ μκ°μ μ΅λ κ°μ΄ λλλ‘ ν΄μΌνλ€.
'μ²μλΆν° νμ¬ μμ κΉμ§λ₯Ό μμλλ μκ° + λ€μ μμ νλλ₯Ό λλ΄λ λ° νμν μκ°' κ°μ΄ μ΅λκ° λμ΄μΌ νλ€.
μμλ‘ μμ Aλ₯Ό μννκΈ° μν΄ Bμ Cλ₯Ό μ νν΄μΌ νλ κ²½μ°, Bμ Cμ€μ λ μ€λ걸리λ μμ μ μνν΄μΌ νλ€.
// costs : ν΄λΉ indexκΉμ§ λ°©λ¬Ένλλ° λ€μ΄κ°λ μ΅μ λΉμ©
// times κ° μ μ μ λΉμ© (μ΄μ μ μ μμ νμ¬ μ μ κΉμ§ λλ¬νλ λ° λΉμ©)
vector<int> costs, times;
for (int node = 1; node <= N; node++) {
costs[node] = times[node] = cost;
}
// λͺ¨λ λ
Έλλ₯Ό λ°©λ¬Ένμ§ μμλ λ¨
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int next : graph[cur]) {
times[next] = max(times[next], costs[next] + times[cur]);
inDegree[next] -= 1;
if (inDegree[next] == 0) {
q.push(next);
}
}
}
for (int node = 1; node <= N; node++) {
answer = max(answer, times[node]);
}