From 8ca8cfece56210c4b635bbf6d03d20287adfd2a8 Mon Sep 17 00:00:00 2001 From: hit_lu Date: Fri, 6 Jun 2025 11:26:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8B=93=E6=89=91=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- topological-sorting.cpp | 120 ++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/topological-sorting.cpp b/topological-sorting.cpp index b62ed52..ec10812 100644 --- a/topological-sorting.cpp +++ b/topological-sorting.cpp @@ -1,72 +1,72 @@ -class Solution +class TopologicalSort { private: - enum class STATUS - { - UN_VISITED, - IN_SEARCHING, - FINISHED - }; + enum class STATUS + { + UN_VISITED, + IN_SEARCHING, + FINISHED + }; - vector> edges; - vector visited; - vector sequence; + vector> edges; + vector visited; + vector sequence; - bool find_cycle = false; // cycle + bool find_cycle = false; // cycle - /** - * @brief deep first search - * @param[in] node index - * - */ - void deepFirstSearch(int node) - { - visited[node] = Status::SEARCHING; - for (int neighbor : edges[node]) { - if (visited[neighbor] == Status::UNVISITED) { - deepFirstSearch(neighbor); - if (find_cycle) { - return; // unsolvable - } - } - else if (visited[neighbor] == Status::SEARCHING) { - find_cycle = true; - return; - } - } - visited[node] = Status::FINISH; - sequence.push_back(node); - } + /** + * @brief deep first search + * @param[in] node index + * + */ + void deepFirstSearch(int node) + { + visited[node] = STATUS::IN_SEARCHING; + for (int neighbor : edges[node]) { + if (visited[neighbor] == STATUS::UN_VISITED) { + deepFirstSearch(neighbor); + if (find_cycle) { + return; // unsolvable + } + } + else if (visited[neighbor] == STATUS::IN_SEARCHING) { + find_cycle = true; + return; + } + } + visited[node] = STATUS::FINISHED; + sequence.push_back(node); + } public: - /** - * @brief topological sequence - * @param[in] number of nodes - * @param[in] node connection - * @retval sequence - */ - vector findTopologicalOrder(int numNodes, vector>& linkage) - { - edges.resize(numNodes); - visited.resize(numNodes, Status::UNVISITED); + /** + * @brief topological sequence + * @param[in] number of nodes + * @param[in] node connection + * @retval sequence + */ + vector findTopologicalOrder(int numNodes, vector>& linkage) + { + edges.resize(numNodes); + visited.resize(numNodes, STATUS::UN_VISITED); - // generate adjacency list - for (const auto& info : linkage) { - edges[info[1]].push_back(info[0]); - } + // generate adjacency list + for (const auto& info : linkage) { + edges[info[1]].push_back(info[0]); + } - // deep first search to determine the topological sequence - for (int i = 0; i < numNodes && !find_cycle; ++i) { - if (visited[i] == Status::UNVISITED) { - deepFirstSearch(i); - } - } + // deep first search to determine the topological sequence + for (int i = 0; i < numNodes && !find_cycle; ++i) { + if (visited[i] == STATUS::UN_VISITED) { + deepFirstSearch(i); + } + } - if (find_cycle) { - return vector(); // unsolvable for cycle - } + if (find_cycle) { + return vector(); // unsolvable for cycle + } - reverse(sequence.begin(), sequence.end()); - return sequence; - } + reverse(sequence.begin(), sequence.end()); + return sequence; + } }; \ No newline at end of file