File tree Expand file tree Collapse file tree 2 files changed +91
-0
lines changed
solution/1100-1199/1192.Critical Connections in a Network Expand file tree Collapse file tree 2 files changed +91
-0
lines changed Original file line number Diff line number Diff line change 45
45
46
46
<!-- 这里可写通用的实现逻辑 -->
47
47
48
+ ** 方法一:Tarjan 算法**
49
+
50
+ 此题中的「关键连接」即为「桥」。
51
+
52
+ 「桥」:在一连通的无向图中,若去除某一边后会使得图不再连通,则这条边可以视作「桥」。
53
+
54
+ 与之相应的概念还有「割点」。
55
+
56
+ 「割点」:在一连通的无向图中,若去除某一点及所有与其相连的边后会使得图不再连通,则这个点可以视作「割点」。
57
+
58
+ 用于求图中的「桥」与「割点」有一算法:tarjan 算法,这个算法使用先递归的访问相邻节点后访问节点自身的 dfs 方法,通过记录「访问的顺序:DFN」以及在递归结束后访问节点自身时探索其可以回溯到的最早被访问的节点来更新「最早可回溯的节点:low」,可以实现在 O(n)时间内找到图的「桥」与「割点」。同时,此种算法可以用于查找有向图中的强连通分量。
59
+
48
60
<!-- tabs:start -->
49
61
50
62
### ** Python3**
63
75
64
76
```
65
77
78
+ ### ** C++**
79
+
80
+ ``` cpp
81
+ class Solution {
82
+ public:
83
+ int count = 0;
84
+ vector<int > dfn, low;
85
+ vector<vector<int >> graph;
86
+ vector<vector<int >> res;
87
+ void tarjan(int u, int fa) {
88
+ dfn[ u] = low[ u] = ++count;
89
+ for (auto& v : graph[ u] ) {
90
+ if (v == fa)
91
+ continue;
92
+ if (!dfn[ v] ) {
93
+ tarjan(v, u);
94
+ low[ u] = min(low[ u] , low[ v] );
95
+ if (dfn[ u] < low[ v] )
96
+ res.push_back({u, v});
97
+ } else {
98
+ low[ u] = min(dfn[ v] , low[ u] );
99
+ }
100
+ }
101
+ }
102
+
103
+ vector<vector<int>> criticalConnections(int n, vector<vector<int>>& connections) {
104
+ dfn.resize(n);
105
+ low.resize(n);
106
+ graph.resize(n);
107
+ for (auto& edge : connections) {
108
+ graph[edge[0]].push_back(edge[1]);
109
+ graph[edge[1]].push_back(edge[0]);
110
+ }
111
+ for (int i = 0 ; i < n; i++) {
112
+ if (!dfn[i])
113
+ tarjan (i, -1);
114
+ }
115
+ return res;
116
+ }
117
+ };
118
+ ```
119
+
66
120
### ** ...**
67
121
68
122
```
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public:
3
+ int count = 0 ;
4
+ vector<int > dfn, low;
5
+ vector<vector<int >> graph;
6
+ vector<vector<int >> res;
7
+ void tarjan (int u, int fa) {
8
+ dfn[u] = low[u] = ++count;
9
+ for (auto & v : graph[u]) {
10
+ if (v == fa)
11
+ continue ;
12
+ if (!dfn[v]) {
13
+ tarjan (v, u);
14
+ low[u] = min (low[u], low[v]);
15
+ if (dfn[u] < low[v])
16
+ res.push_back ({u, v});
17
+ } else {
18
+ low[u] = min (dfn[v], low[u]);
19
+ }
20
+ }
21
+ }
22
+
23
+ vector<vector<int >> criticalConnections (int n, vector<vector<int >>& connections) {
24
+ dfn.resize (n);
25
+ low.resize (n);
26
+ graph.resize (n);
27
+ for (auto & edge : connections) {
28
+ graph[edge[0 ]].push_back (edge[1 ]);
29
+ graph[edge[1 ]].push_back (edge[0 ]);
30
+ }
31
+ for (int i = 0 ; i < n; i++) {
32
+ if (!dfn[i])
33
+ tarjan (i, -1 );
34
+ }
35
+ return res;
36
+ }
37
+ };
You can’t perform that action at this time.
0 commit comments