Skip to content

Commit c5ca447

Browse files
authored
feat: add cpp solution to lc problem: No.1192 (doocs#836)
No.1192.Critical Connections in a Network
1 parent e12f22b commit c5ca447

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

solution/1100-1199/1192.Critical Connections in a Network/README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:Tarjan 算法**
49+
50+
此题中的「关键连接」即为「桥」。
51+
52+
「桥」:在一连通的无向图中,若去除某一边后会使得图不再连通,则这条边可以视作「桥」。
53+
54+
与之相应的概念还有「割点」。
55+
56+
「割点」:在一连通的无向图中,若去除某一点及所有与其相连的边后会使得图不再连通,则这个点可以视作「割点」。
57+
58+
用于求图中的「桥」与「割点」有一算法:tarjan 算法,这个算法使用先递归的访问相邻节点后访问节点自身的 dfs 方法,通过记录「访问的顺序:DFN」以及在递归结束后访问节点自身时探索其可以回溯到的最早被访问的节点来更新「最早可回溯的节点:low」,可以实现在 O(n)时间内找到图的「桥」与「割点」。同时,此种算法可以用于查找有向图中的强连通分量。
59+
4860
<!-- tabs:start -->
4961

5062
### **Python3**
@@ -63,6 +75,48 @@
6375

6476
```
6577

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+
66120
### **...**
67121

68122
```
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
};

0 commit comments

Comments
 (0)