61 absl::Span<
const std::pair<int, int>> arcs,
bool* error_was_cyclic,
62 std::vector<int>* error_cycle_out) {
63 CHECK(error_was_cyclic !=
nullptr);
64 CHECK(error_cycle_out !=
nullptr);
65 *error_was_cyclic =
false;
66 error_cycle_out->clear();
67 if (arcs.empty())
return {};
69 for (
const std::pair<int, int>& arc : arcs) {
70 CHECK_GE(arc.first, 0);
71 CHECK_GE(arc.second, 0);
72 num_nodes = std::max(num_nodes, arc.first + 1);
73 num_nodes = std::max(num_nodes, arc.second + 1);
76 for (
const auto& arc : arcs) {
77 sorter.
AddEdge(arc.first, arc.second);
79 std::vector<int> topological_order;
81 while (sorter.
GetNext(&next, error_was_cyclic, error_cycle_out)) {
82 topological_order.push_back(next);
84 if (*error_was_cyclic)
return {};
85 std::vector<std::vector<int>> adjacency_list(num_nodes);
86 for (
const auto& arc : arcs) {
87 adjacency_list[arc.first].push_back(arc.second);
90 std::vector<Bitset64<int64_t>> connectivity(num_nodes);
92 bitset.Resize(num_nodes);
94 for (
const auto& arc : arcs) {
95 connectivity[arc.first].Set(arc.second);
99 std::reverse(topological_order.begin(), topological_order.end());
103 for (
const int node : topological_order) {
104 for (
const int child : adjacency_list[node]) {
105 connectivity[node].Union(connectivity[child]);
112 absl::Span<
const std::pair<int, int>> arcs) {
113 bool error_was_cyclic =
false;
114 std::vector<int> error_cycle;
115 std::vector<Bitset64<int64_t>> result =
117 CHECK(!error_was_cyclic) <<
"Graph should have been acyclic but has cycle: "