From e9d90c396de3ee0d4c43ffe6938ec841305595c6 Mon Sep 17 00:00:00 2001 From: Eat-Swap Date: Wed, 18 May 2022 22:11:58 +0800 Subject: [PATCH] add: 220518 [cpp] --- cpp/2205/220518.cpp | 49 +++++++++++++++++++++++++++++++++++++++++ cpp/2205/CMakeLists.txt | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 cpp/2205/220518.cpp diff --git a/cpp/2205/220518.cpp b/cpp/2205/220518.cpp new file mode 100644 index 0000000..348f12e --- /dev/null +++ b/cpp/2205/220518.cpp @@ -0,0 +1,49 @@ +#include +#include + +class Solution { +public: + static std::vector> criticalConnections(int n, const std::vector>& e) { + auto* G = new std::vector[n]; + for (const std::vector& i : e) { + G[i[0]].push_back(i[1]); + G[i[1]].push_back(i[0]); + } + + std::vector preTS(n); + int dfsTS = 0; + std::vector> ret; + std::function dfs = [&](int u, int prevE) { + int low_u = preTS[u] = ++dfsTS; + + int chCnt = 0; + for (int v : G[u]) { + if (v == prevE) + continue; + if (preTS[v] && preTS[v] < preTS[u]) { + low_u = std::min(low_u, preTS[v]); + } else if (!preTS[v]) { + ++chCnt; + int low_v = dfs(v, u); + low_u = std::min(low_u, low_v); + if (low_v > preTS[u]) { + // u is an articulation vertex + // (u, v) is a bridge + ret.push_back({u, v}); + } + } + } + return low_u; + }; + dfs(0, -1); + + delete[] G; + return ret; + } +}; + +int main() { + auto r = Solution::criticalConnections(5, {{1,0},{2,0},{3,2},{4,2},{4,3},{3,0},{4,0}}); + + return 0; +} diff --git a/cpp/2205/CMakeLists.txt b/cpp/2205/CMakeLists.txt index 730f500..e92713e 100644 --- a/cpp/2205/CMakeLists.txt +++ b/cpp/2205/CMakeLists.txt @@ -3,4 +3,4 @@ PROJECT(2205) SET(CMAKE_CXX_STANDARD 23) -ADD_EXECUTABLE(2205 220517-CN.cpp 220517.cpp) +ADD_EXECUTABLE(2205 220518.cpp)