| 4 | #include "strongly_connected_components.h" |
| 5 | |
| 6 | int main() { |
| 7 | // we only have a single test case for now |
| 8 | int n = 10; |
| 9 | vector<vector<int>> adj(n); |
| 10 | adj[0].push_back(1); |
| 11 | adj[0].push_back(7); |
| 12 | adj[1].push_back(1); |
| 13 | adj[1].push_back(2); |
| 14 | adj[2].push_back(1); |
| 15 | adj[2].push_back(5); |
| 16 | adj[3].push_back(2); |
| 17 | adj[3].push_back(4); |
| 18 | adj[4].push_back(9); |
| 19 | adj[5].push_back(3); |
| 20 | adj[5].push_back(6); |
| 21 | adj[5].push_back(9); |
| 22 | adj[6].push_back(2); |
| 23 | adj[7].push_back(0); |
| 24 | adj[7].push_back(6); |
| 25 | adj[7].push_back(8); |
| 26 | adj[8].push_back(6); |
| 27 | adj[8].push_back(9); |
| 28 | adj[9].push_back(4); |
| 29 | |
| 30 | vector<vector<int>> components, adj_scc; |
| 31 | strongly_connected_components(adj, components, adj_scc); |
| 32 | |
| 33 | auto sorted_components = components; |
| 34 | for (vector<int> &a : sorted_components) |
| 35 | sort(a.begin(), a.end()); |
| 36 | sort(sorted_components.begin(), sorted_components.end(), |
| 37 | [](auto &l, auto &r) { return l[0] < r[0]; }); |
| 38 | |
| 39 | vector<int> root(n); |
| 40 | for (auto &comp : components) { |
| 41 | for (auto v : comp) { |
| 42 | root[v] = *comp.begin(); |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | vector<int> minimal_element(n); |
| 47 | for (auto &comp : components) { |
| 48 | minimal_element[*comp.begin()] = *min_element(comp.begin(), comp.end()); |
| 49 | } |
| 50 | |
| 51 | for (vector<int> &a : adj_scc) |
| 52 | sort(a.begin(), a.end(), [minimal_element](auto &l, auto &r) { return minimal_element[l] < minimal_element[r]; }); |
| 53 | |
| 54 | assert(sorted_components.size() == 4); |
| 55 | assert(sorted_components[0] == std::vector<int>({0, 7})); |
| 56 | assert(sorted_components[1] == std::vector<int>({1, 2, 3, 5, 6})); |
| 57 | assert(sorted_components[2] == std::vector<int>({4, 9})); |
| 58 | assert(sorted_components[3] == std::vector<int>({8})); |
| 59 | |
| 60 | assert(adj_scc[root[0]] == std::vector<int>({root[1], root[1], root[8]})); |
| 61 | assert(adj_scc[root[1]] == std::vector<int>({root[4], root[4]})); |
| 62 | assert(adj_scc[root[8]] == std::vector<int>({root[1], root[4]})); |
| 63 |
nothing calls this directly
no outgoing calls
no test coverage detected