-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathtopo-sort-kahn.cpp
36 lines (26 loc) · 951 Bytes
/
topo-sort-kahn.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
Topological sort - Kahn
Motivação: dado um directed graph, encontre qualquer sequência linear de vértices, tal que, se nela u vem antes de v, existe um caminho u -> v.
---
Como é sempre priorizado o menor vértice em casos de não relação, há uma única solução.
*/
#include <bits/stdc++.h>
using namespace std;
/* input */
vector<vector<int>> adj_list; int V;
/* O(V+E) - retorna os vértices em ordem topológica */
vector<int> kahn() {
vector<int> in_degree(V, 0);
priority_queue<int> pq; // prioriza o menor vértice com in_degree atual 0
for (int u = 0; u < V; u++) for (int v : adj_list[u]) in_degree[v]++;
for (int u = 0; u < V; u++) if (in_degree[u] == 0) pq.push(-u);
vector<int> ts;
while (!pq.empty()) {
int u = -pq.top(); pq.pop();
ts.push_back(u);
for (int v : adj_list[u])
if (--in_degree[v] == 0)
pq.push(-v);
}
return ts;
}