-
Notifications
You must be signed in to change notification settings - Fork 122
/
Copy path1192. Critical Connections in a Network.cpp
54 lines (45 loc) · 1.45 KB
/
1192. Critical Connections in a Network.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// 1192.✅ Critical Connections in a Network
class Solution
{
public:
void DFS(int sv, vector<int> adj[], vector<int> &disc, vector<int> &low, vector<int> &parent, vector<vector<int>> &bridges)
{
static int time = 0;
disc[sv] = low[sv] = time;
time += 1;
for (int v : adj[sv])
{
if (disc[v] == -1)
{
parent[v] = sv;
DFS(v, adj, disc, low, parent, bridges);
low[sv] = min(low[sv], low[v]);
if (low[v] > disc[sv])
bridges.push_back(vector<int>({sv, v}));
}
else if (v != parent[sv])
low[sv] = min(low[sv], disc[v]);
}
}
void findBridges_Tarjan(int n, vector<int> adj[], vector<vector<int>> &bridges)
{
vector<int> disc(n + 1, -1), low(n + 1, -1), parent(n + 1, -1);
for (int i = 0; i < n; ++i)
{
if (disc[i] == -1)
DFS(i, adj, disc, low, parent, bridges);
}
}
vector<vector<int>> criticalConnections(int n, vector<vector<int>> &connections)
{
vector<int> adj[n + 1];
for (int i = 0; i < connections.size(); ++i)
{
adj[connections[i][0]].push_back(connections[i][1]);
adj[connections[i][1]].push_back(connections[i][0]);
}
vector<vector<int>> bridges;
findBridges_Tarjan(n, adj, bridges);
return bridges;
}
};