From 54248a101f3e569eb421f741afed4431f0dc85c1 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Sun, 24 May 2020 11:52:29 +0530 Subject: [PATCH] feat : bridge finding with tarjan algorithm --- .../bridge_finding_with_tarjan_algorithm.cpp | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 graph/bridge_finding_with_tarjan_algorithm.cpp diff --git a/graph/bridge_finding_with_tarjan_algorithm.cpp b/graph/bridge_finding_with_tarjan_algorithm.cpp new file mode 100644 index 000000000..ca124f512 --- /dev/null +++ b/graph/bridge_finding_with_tarjan_algorithm.cpp @@ -0,0 +1,79 @@ +/* + * Copyright : 2020 , MIT + * Author : Amit Kumar (offamitkumar) + * Last Modified Date: May 24, 2020 + * + */ +#include // for std::vector +#include // for min & max +#include // for cout +using std::vector; +using std::cout; +using std::min; +class Solution { + vector < vector < int > > graph; + vectorin_time , out_time; + int timer; + vector < vector < int > > bridge; + vectorvisited; + void dfs(int current_node , int parent) { + visited.at(current_node) = true; + in_time[current_node] = out_time[current_node] = timer++; + for ( auto&itr : graph[current_node] ) { + if (itr == parent) { + continue; + } + if (!visited[itr]) { + dfs(itr , current_node); + if (out_time[itr] > in_time[current_node]) { + bridge.push_back({itr, current_node}); + } + } + out_time[current_node] = min(out_time[current_node], out_time[itr]); + } + } + + public: + vector > search_bridges(int n, + const vector>& connections) { + timer = 0; + graph.resize(n); + in_time.assign(n, 0); + visited.assign(n, false); + out_time.assign(n, 0); + for (auto&itr : connections) { + graph.at(itr[0]).push_back(itr[1]); + graph.at(itr[1]).push_back(itr[0]); + } + dfs(0, -1); + return bridge; + } +}; +int main(void) { + Solution s1; + int number_of_node = 5; + vector< vector >node; + node.push_back({0, 1}); + node.push_back({1, 3}); + node.push_back({1, 2}); + node.push_back({2, 4}); + /* + * 0 <--> 1 <---> 2 + * ^ ^ + * | | + * | | + * \/ \/ + * 3 4 + * + * In this graph there are 4 bridges [0,2] , [2,4] , [3,5] , [1,2] + * + * I assumed that the graph is bi-directional and connected. + * + */ + vector< vector > bridges = s1.search_bridges(number_of_node , node); + cout << bridges.size() << " bridges found!\n"; + for (auto&itr : bridges) { + cout << itr[0] << " --> " << itr[1] << '\n'; + } + return 0; +}